Почему нельзя ссылаться на дочерний объект Class на родительский объект Class? - PullRequest
13 голосов
/ 27 января 2010

Я объяснял ООП моему другу. Я не смог ответить на этот вопрос. (Как мне стыдно? :()

Я только что сбежал, сказав, что ООП изображает реальный мир. В реальном мире родители могут разместить детей, но дети не могут разместить родителей. То же самое и в ООП. Я знаю, что это глупо. : P

class Parent
{
  int prop1;
  int prop2;
}

class Child : Parent // class Child extends Parent  (in case of Java Lang.)
{
  int prop3;
  int prop4;

  public static void Main()
  {
     Child aChild = new Child();
     Parent aParent = new Parent();
     aParent = aChild;// is perfectly valid.
     aChild = aParent;// is not valid. Why??

  }
}

Почему это утверждение недействительно?

 aChild = aParent;// is not valid. Why??

, поскольку члены aChild - это расширенные члены aParent. Тогда почему ребенок не может разместить родителя.

Ответы [ 13 ]

0 голосов
/ 27 января 2010

Я думаю, вы выбрали неправильную модель для реальных родителей и детей;) В реальной жизни родитель всегда является ребенком, а ребенок может быть родителем.

Если перевернуть, это сработает:

class Child {
  Child[] parents;
}

class Parent : Child {
  Child[] children;
}

Родитель является ребенком (от своих родителей), и мы можем выразить:

Child aChild = aParent;

потому что каждый родитель тоже ребенок, но не

Parent aParent = aChild;

потому что не все дети являются родителями.

0 голосов
/ 27 января 2010

Семантически наследование обозначает отношение «является». Например, медведь «это «вид млекопитающего, дом» - это вид материального актива, а быстрый вид «это» особый вид алгоритма сортировки. Наследование, таким образом, подразумевает обобщение / иерархия специализации, в которой подкласс специализируется на более общей структуре или поведение его суперклассов. Действительно, это лакмусовая бумажка для наследования: если B не является разновидностью A, то B не должен наследоваться от A. В вашем случае это означает, что Родитель "является" ребенком, но не наоборот.

P.S. Я думаю, что в этом случае вы нарушаете основные принципы наследования.

0 голосов
/ 27 января 2010

Я думаю, что вы имеете в виду:

Child aChild = aParent;

Вы не указали, что aChild имеет тип Child.

Ссылка на тип Child будет означать, что вы можете вызывать членов, которые могут отсутствовать в Parent. Таким образом, если вы назначите объект Parent для ссылки Child, вы сможете вызывать членов, которые не существуют в Parent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...