如何在子类的实例方法中返回超类对象?

时间:2014-09-25 04:07:08

标签: java oop

以下是我原始问题的玩具问题。 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() );
       }
}

2 个答案:

答案 0 :(得分:3)

只需返回对象本身:

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

我给出了答案,但我不确定你是否有设计噩梦或独一无二的设计简化。实现Point的{​​{1}}子类让我头脑发热,但是在一个对象中使用这两种类型会使计算非常整洁,(如果你有大量的计算,那就是)。因为代替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

答案 1 :(得分:2)

Cardinal类对象与Point类对象具有 is-a 关系,因此您可以像Krumia建议的那样return this;

P.S。您可以在引用子类中的超类时使用super关键字来访问受保护的公共方法。