Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何返回子类中的超类对象';s实例方法?_Java_Oop - Fatal编程技术网

Java 如何返回子类中的超类对象';s实例方法?

Java 如何返回子类中的超类对象';s实例方法?,java,oop,Java,Oop,下面是我的原始问题的一个玩具问题鸟是一个接口Cardinal是Point的子类,它实现了Bird接口。鸟舍类执行实现 问题:我应该在getPosition()实例方法中放置什么,以便Aviary类正确地携带getPosition()方法 如果bird界面中的抽象方法编码错误,请更正 public interface Bird{ public Point getPosition(); } public class Point{ private int x; private

下面是我的原始问题的一个玩具问题<代码>鸟是一个接口
Cardinal
Point
的子类,它实现了
Bird
接口。
鸟舍
类执行实现

问题:我应该在
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() );
       }
}

只需返回对象本身:

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

我给出了一个答案,但我不确定你是否有一个设计噩梦或一种单一的设计简化。一个
子类实现了一个
使我头痛不已,但是在一个对象中同时使用这两种类型会使计算变得非常简洁(如果你有大量的计算)。因为您可以编写
bird.getX()
,而不是
bird.getPosition().getX()

但是,如果您的系统不是一个需要对仅由
对象表示的鸟类进行大量计算的鸟类模拟器,我认为您应该使用组合而不是继承

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() );

只需返回对象本身:

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

我给出了一个答案,但我不确定你是否有一个设计噩梦或一种单一的设计简化。一个
子类实现了一个
使我头痛不已,但是在一个对象中同时使用这两种类型会使计算变得非常简洁(如果你有大量的计算)。因为您可以编写
bird.getX()
,而不是
bird.getPosition().getX()

但是,如果您的系统不是一个需要对仅由
对象表示的鸟类进行大量计算的鸟类模拟器,我认为您应该使用组合而不是继承

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() );

Cardinal
类对象与
类对象有一个is-a关系,因此您可以
返回它如Krumia所建议


另外,在引用子类中的超类时,您可以使用
super
关键字来访问它的受保护和公共方法。

基本类对象与
类对象具有is-a关系,因此您可以只
返回此值如Krumia所建议


另外,在引用子类中的超类时,可以使用
super
关键字来访问它的受保护和公共方法。

在getPosition()中,写入:返回此为什么
基数
基数
实例不应该使用
实例变量来跟踪其位置吗?如果代码期望一个位置得到一只鸟,那将是相当令人惊讶的。一个<代码>基数一个<代码>点?这是检查继承是否合理的典型问题。另一方面,说“红衣主教有一个位置,这是一个点”是完全有道理的。这意味着用构图代替构图更有意义。为此,只需将
成员变量添加到
基数
类中即可。更好的方法是,让
Bird
成为一个带有
Point
成员变量的抽象类,因为每个Bird都有一个位置。使用组合也会让你更直接的问题的答案变得非常明显。嗨,我是Java新手。请详细说明作文。谢谢我很高兴能学到新东西。在getPosition()中,写下:return this为什么a
Cardinal
a
Point
基数
实例不应该使用
实例变量来跟踪其位置吗?如果代码期望一个位置得到一只鸟,那将是相当令人惊讶的。一个<代码>基数一个<代码>点?这是检查继承是否合理的典型问题。另一方面,说“红衣主教有一个位置,这是一个点”是完全有道理的。这意味着用构图代替构图更有意义。为此,只需将
成员变量添加到
基数
类中即可。更好的方法是,让
Bird
成为一个带有
Point
成员变量的抽象类,因为每个Bird都有一个位置。使用组合也会让你更直接的问题的答案变得非常明显。嗨,我是Java新手。请详细说明作文。谢谢我很高兴能学到新东西。谢谢。现在这就更有意义了。你让我意识到我不应该盲目使用遗产。谢谢。现在这就更有意义了。你让我意识到我不应该盲目使用遗产。