package com.java1.day18;
//인터페이스를 이용한 다형성..
/**
* 다형성에 대해 학습할때 자손클래스의 인스턴스를 조상타입의 참조변수로 참조 하는것이 가능 하다는 것을 배웠다.
* 인터페이스 역시 이를 구현한 클래스의 조상이라 할수 있으므로 해당 인터페이스 타입의 참조변수로 이를 구현한 클래스의
* 인스턴스를 참조할수 있으며, 인터페이스 타입으로의 형변환도 가능하다.
* Fightable f = (Figthable)new Fighter();
* Fingtable f = new Fighter();
* 따라서 인터페이슨 다음과 같이 메서드의 매개변수의 타입으로 사용될 수 있다.
* void attack(Fightable f) {
* .....
* }
* attack메서드르 호출할 때는 매개변수로 Fightable 인터페이슬 구현한 클래스의 인스턴스를 넘겨주어야 한다.
*/
public class ParserTest6 {
public static void main(String[] args) {
Parseable parser = ParserManager.getParser("XML");
parser.parse("document.xml");
parser = ParserManager.getParser("HTML");
parser.parse("document2.html");
}
}
interface Parseable {
public abstract void parse(String fileName); // 구문 분석작업을 수행한다.
}
class ParserManager {
// 리턴타입이 Parseable인터페이스이다.
//리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
public static Parseable getParser(String type) {
if(type.equals("XML")) {
return new XMLParser();
} else {
Parseable p = new HTMLParser();
return p;
// return new HTMLParser(); 위의 두 줄을 간단히 할 수 있다.
}
}
}
class XMLParser implements Parseable {
public void parse(String fileName) { //아래 코드에서 완성을 해주었으니까 abstract가 없어야된다.
/* 구문 분석작업을 수행하는 코드를 적는다. */
System.out.println(fileName + " - XML parsing completed.");
}
}
class HTMLParser implements Parseable {
public void parse(String fileName) {
/* 구문 분석작업을 수행하는 코드를 적는다. */
System.out.println(fileName + " - HTML parsing completed.");
}
}
document.xml - XML parsing completed.
document2.html - HTML parsing completed.