2014-09-25 5 views
0

Следующая проблема с игрушкой моей оригинальной проблемы. Bird - это интерфейс. Cardinal является подклассом Point, и он реализует интерфейс 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

+1

Почему «кардинал» является «точкой»? Не следует ли вместо экземпляра «Cardinal» использовать переменную экземпляра «Point», чтобы отслеживать ее местоположение? Было бы удивительно, если бы код, ожидающий места, получил птицу. – user2357112

+1

Является ли «кардинал» «точкой»? Это типичный вопрос, который нужно попросить проверить, имеет ли смысл наследование. С другой стороны, имеет смысл сказать: «У кардинала есть позиция, которая является точкой». Это означает, что имеет смысл использовать композицию вместо этого. Для этого просто добавьте переменную члена «Point» в класс «Cardinal». Еще лучше сделайте 'Bird' абстрактным классом с переменной' Point', так как ** каждая ** птица имеет позицию. –

ответ

3

Просто вернуть сам объект:

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 объекты класса имеют есть- отношения с объектами Point класса, так что вы можете просто return this; как предложено Krumia.

P.S. вы можете использовать ключевое слово super при обращении к суперклассу в подклассе для доступа к его защищенным и общественным методам.

Смежные вопросы