구현
interface Fightable {
void move(int x, int y); // public abstract가 생략됨
// ※ 매개변수로 Fightable 인터페이스를 구현한 클래스의 인스턴스만 가능
void attack(Fightable f); // public abstract가 생략됨
}
class Fighter extends Unit implements Fightable{
// 오버라이딩 규칙 : 조상(public)보다 접근제어자가 범위가 좁으면 안된다.
public void move(int x, int y) { /* 내용 생략 */ }
public void attack(Fightable f) { /* 내용 생략 */ }
}
사용
Unit u = new Fighter();
// 인터페이스 타입의 참조변수로 인터페이스를 구현한 객체를 가리키는게 가능하다.
Fightable f = new Fighter();
f.move(100, 200);
f.attack(new Fighter());
// Fightable 인터페이스를 구현한 클래스의 인스턴스를 반환
Fightable method() {
...
Fighter f = new Fighter();
return f; // 인터페이스를 구현한 객체를 반환. return (Fightable)f; OK
// return new Fighter(); // 위 두 문장을 한 문장으로 바꾼 코드
// 다음과 같이 작성도 가능
// Fightable f = new Fighter(); // Fightable f = (Fightable)new Fighter(); OK
// return f;
// Fightable f = method(); -> Fightable f = new Fighter();
}