2014-09-25 144 views
0

以下是我的原始問題的玩具問題。 Bird是一個接口。 CardinalPoint的子類,它實現Bird接口。 Aviary類執行實施。如何在子類的實例方法中返回超類對象?

問:我應該把什麼在getPosition()實例方法使得Aviary類正確攜帶getPosition()方法?

如果bird接口中的抽象方法編碼錯誤,請糾正我的錯誤。

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 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()中,寫下:return this – pd30 2014-09-25 04:13:54

+1

爲什麼'Cardinal'是'Point'?不應該使用'Cardinal'實例來使用'Point'實例變量來跟蹤它的位置嗎?如果代碼期望某個位置有鳥,那將是非常令人驚訝的。 – user2357112 2014-09-25 04:15:42

+1

'Cardinal'是''Point''嗎?這是要檢查繼承是否有意義的典型問題。另一方面,說「紅衣主教的位置是一個點」是完全合理的。這意味着使用組合代替更合理。爲此,只需在'Cardinal'類中添加一個'Point'成員變量即可。更好的做法是讓'Bird'成爲一個具有'Point'成員變量的抽象類,因爲**每個**都有一個位置。 – 2014-09-25 04:16:59

回答

3

只返回對象本身:我給了一個答案

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

,但我不知道你是否有一個設計噩夢或獨一無二的設計簡化。一個執行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 2014-09-25 04:37:23

2

Cardinal類對象有一個是,一個與Point類對象關係,所以你可以只return this;作爲Krumia建議。

P.S.當引用子類中的超類來訪問它的保護public方法時,可以使用super關鍵字。

相關問題