2014-09-25 3 views
0

다음은 제 원래 문제의 장난감 문제입니다. Bird은 인터페이스입니다. CardinalPoint의 하위 클래스이며 Bird 인터페이스를 구현합니다. Aviary 클래스는 구현을 수행합니다.하위 클래스의 인스턴스 메서드에서 수퍼 클래스 개체를 반환하는 방법?

질문 : Aviary 클래스가 올바르게 getPosition() 방법을 수행하는 것이 같은 getPosition() 인스턴스 메소드에 넣어해야합니까?

bird 인터페이스의 추상 메소드가 잘못 코딩 된 경우 저를 시정하십시오.

public class Cardinal extends Point implements Bird{ 

    // Constructors 
    public Cardinal(int x , int y){ 
     this(x,y); 
    } 

    // not sure how to write this instance method 
    public Point getPosition(){ 
     ??????????? 
    } 

} 

public class Aviary{ 
     public static void main(String[] args){ 
       Bird bird1 = new Cardinal(3,8); 
       Point pos = bird1.getPosition(); 
       System.out.println("X: " + pos.getX() + ", Y: " + pos.getY()); 
     } 
} 
+0

getPosition()에서 다음을 작성하십시오. – pd30

+1

왜 '추기경'은 '점'입니까? '추기경'인스턴스가 대신'Point' 인스턴스 변수를 사용해서 그 위치를 추적해서는 안되나요? 위치를 예상하는 코드에 새가 있다면 상당히 놀랍습니다. – user2357112

+1

'추기경'은'점'입니까? 이것은 상속이 합리적인지 확인하기 위해 묻는 전형적인 질문입니다. 반면에, "추기경에게는 한 가지 입장이 있습니다."라고 말하는 것은 완전히 의미가 있습니다. 이것은 대신 컴포지션을 사용하는 것이 더 합리적임을 의미합니다. 이렇게하려면 단순히'Point' 멤버 변수를'Cardinal' 클래스에 추가하십시오. 더 나은 것은, 모든 버드가 위치를 가지고 있기 때문에'버드 (bird)'를'포인트'멤버 변수를 가진 추상 클래스로 만드세요. –

답변

3

그냥 개체 자체 반환 :

public interface Bird{ 
    public Point getPosition(); 
} 

public class Point{ 
    private int x; 
    private int y; 

// Constructs a new Point at the given initial x/y position. 
    public Point(int x, int y){ 
     this.x = x; 
     this.y = y; 
    } 

// Returns the x-coordinate of this point 
    public int getX(){ 
     return x; 
    } 

    // Returns the y-coordinate of this Point 
    public int getY(){ 
     return y; 
    } 
} 

질문은 다음 코드에

public Point getPosition(){ 
    return this; // returns a Point object 
} 

내가 대답을했다,하지만 난 당신이있을 경우 확실하지 않다 디자인의 악몽 또는 일종의 디자인 단순화. Point 서브 클래스가 Bird을 구현하면 벽에 내 머리가 부딪치게됩니다.하지만 한 가지 개체에 두 가지 유형을 모두 사용하면 계산이 매우 정교 해집니다 (방대한 계산이있는 경우). bird.getPosition().getX() 대신 bird.getX()을 쓸 수 있습니다.

Point bird1 = new Cardinal(3, 8); 
Point bird2 = new Cardinal(4, 12); 

// calculate the distance between two birds 
double distance = Math.sqrt(Math.pow(bird2.getX() - bird1.getX(), 2) + Math.pow(bird2.getY() - bird2.getY(), 2)); 

그러나 시스템이 단순한 Point 객체로 표현 조류 무거운 계산을 필요로하는 새 시뮬레이터가 아닌 경우, 당신이 상속을 통해 구성을 사용한다고 생각합니다.

public interface IBird { 
    public Point getPosition() 
} 

class Bird implements IBird { 
    private Point position; 

    public Bird(int x, int y) { 
     this.position = new Point(x, y); 
    } 

    public Point getPosition() { 
     return this.position; 
    } 
} 

// and then in main() 
Bird bird = new Bird(3, 8); 
Point pos = bird.getPosition(); 
System.out.println("X: " + pos.getX() + ", Y: " + pos.getY()); 
+0

감사합니다. 이것은 지금 훨씬 더 의미가 있습니다. 그리고 당신은 상속을 맹목적으로 사용해서는 안된다는 것을 깨닫게했습니다. – mynameisJEFF

2

Cardinal 클래스 객체는 는-a를 Point 클래스 객체와 관계를 가지고, 그래서 당신은 Krumia 제안 단지 return this; 수있다.

P. 서브 클래스 내의 수퍼 클래스를 참조 할 때 protectedpublic 메소드에 액세스 할 때 super 키워드를 사용할 수 있습니다.

관련 문제