проблема наследования ООП расширяется - PullRequest
0 голосов
/ 06 июня 2010

Если Отец - это Родитель, а Родитель - это Личность, а у Личности есть Отец, я создаю следующее:

 class Person{
  Father father;
 }
 class Parent extends Person{}
 class Father extends Parent{}

Экземпляры:

Person p1 = new Person();
Person p2 = new Person();
p1.father = p2; //father is of the type Father

Это не работает ... Теперь попробуйте кастинг ::

Person p1 = new Person();
Person p2 = new Person();
p1.father = (Father)p2;

Это тоже не работает.

Что работает в этом случае?

Ответы [ 3 ]

1 голос
/ 06 июня 2010

Самое очевидное, что Отец - это Личность. Человек НЕ ДОЛЖЕН быть Отцом, когда речь идет о конкретном случае. Этот пример, в частности, сработал бы, если бы у вас поле отца было типа Person или вы создали экземпляр p2 как новый Отец.

1 голос
/ 06 июня 2010

На самом деле, Отец не подкласс человека. Это просто отношение.

 class Person {
    Person father;
 }
0 голосов
/ 06 июня 2010

Вы не можете так разыгрывать.Ваш человек - , а не отец, поэтому приведение к одному не сработает.Вы можете привести только к чему-то, что объект является .

Person p1 = new Person();
Person p2 = new Father();
p1.father = (Father)p2;

Или напрямую:

Father p2 = new Father();
p1.father = p2;

Но быть отцом не является хорошей дифференциацией виерархия классов.Я, вероятно, не стал бы создавать собственный класс для него: быть отцом - это просто одна из многих ролей, которую выполняет один человек, поэтому я бы удалил этот класс и объявил бы член father как обычный Person,То же самое для Parent.

...