Наследственные сомнения - PullRequest
       4

Наследственные сомнения

5 голосов
/ 17 августа 2011

Я относительно новичок в ООП, поэтому хотел кое-что прояснить,

У меня есть следующий кусок кода

class Parent
{
     public Parent()
     {
           Console.WriteLine("Parent Class constructor");
     }

     public void Print()
     {
            Console.WriteLine("Parent->Print()");
     }
}

class Child : Parent
{
     public Child() 
     {
          Console.WriteLine("Child class constructor");
     }

     public static void Main()
     {
           Child ChildObject = new Child();
           Parent ParentObject = new Child();

           ChildObject.Print();
           ParentObject.Print();
     }

}

Выход:

Parent Class Constructor
Child Class constructor

Parent Class Constructor
Child Class constructor

Parent->Print()
Parent->Print()

Мои вопросы следующие:

1) Почему конструктор базового класса вызывается, когда я создаю экземпляры объектов с помощью конструктора ChildClass? без явного указания ключевого слова base. Есть ли способ избежать вызова конструктора базового класса?

2) почему возможно ParentClass ParentObj = new ChildClass();? и не наоборот.

Ответы [ 6 ]

6 голосов
/ 17 августа 2011
  1. Будут вызваны все конструкторы базовых классов вплоть до дерева наследования. Конструкторы всегда объединяются в цепочку, начиная с родительского класса до самого производного класса.

  2. Экземпляры ChildClass "являются" экземплярами ParentClass. Они моделируют отношения «есть», но не наоборот.

4 голосов
/ 17 августа 2011

Одним словом, полиморфизм .

При Child наследовании Parent дочерний объект приобретает характеристики родительского объекта.Если вы думаете об этом с генетической точки зрения, это может иметь больше смысла.

1) Почему вызывается конструктор базового класса, когда я создаю экземпляры объектов с помощью конструктора ChildClass?без явного указания базового ключевого слова.Есть ли способ избежать вызова конструктора базового класса?

Нет способа обойти вызываемый конструктор базового класса (о котором я знаю).Смысл вызова конструктора базового класса заключается в том, чтобы создать экземпляр базового класса (передать параметры, инициализировать другие объекты, присвоить значения и т. Д.)

2) почему ParentClass ParentObj = new ChildClass ();возможный?и не наоборот.

Из-за полиморфизма Child выглядит как Parent и, следовательно, может создаваться как Parent.Поскольку Parent не наследует Child, Parent не похож на Child и, следовательно, не может быть создан как Child.

Для чего это стоит, использование Родителя и Ребенка имеет разные значения.Обычно при ссылке на наследование Parent является базовым классом, где Child будет производным или подтипом .

3 голосов
/ 17 августа 2011
  1. Поскольку компилятор вставляет : base(), если не указано иное.
    Вы можете явно вызвать : base("foo"), если у вас есть конструктор Parent(string s), тогда Parent() не вызывается.Вы не можете пропустить конструктор базового класса, вызывающий все вместе.
  2. Потому что Animal animal = new Dog(); имеет смысл, а не Dog dog = new Animal(); Собака всегда животное, но не обязательно наоборот.
1 голос
/ 17 августа 2011

1) Вероятно, сбивает с толку, потому что вы используете номенклатуру Child / Parent. Потому что Child / Parent подразумевает два разных экземпляра (отношение владельца). Наследование - это отношения Is-A. Собака это животное. Таким образом, класс собаки мог наследовать от животного.

2) Опять же, у вас может быть животное, которое оказывается собакой, но у вас есть только ручка животного на нем. Как будто вы можете держать поводок, и на другом конце у него может быть слон или блоха, но поводок может держать любое животное.

0 голосов
/ 17 августа 2011

1) В C #, если вы не укажете вызов другого конструктора, использующего что-то вроде base(blah), он вызовет конструктор по умолчанию . Который вы определили выше.

2) Каждый ChildClass всегда будет ParentClass. Однако могут быть объекты, которые ParentClass, но не ChildClass. Например, если у вас есть OtherChildClass : ParentClass, это будет ParentClass, но это не будет ChildClass.

0 голосов
/ 17 августа 2011

1) В базовом классе есть (или могут быть) частные члены, о которых дочерний класс ничего не знает, но они необходимы.Следовательно, родительский конструктор вызывается первым, чтобы охватить эту возможность.

2) ChildClass - это тип ParentClass, а Square - это тип Rectangle.Во всяком случае, это теория.Вот почему не имеет смысла иметь это наоборот.

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