В чем разница между дочерним родительским классом и производным базового класса в VB.NET или C#?

после задавать вопрос вызов метода, для которого требуется экземпляр производного класса, типизированный как базовый класс в VB.NET или C# при переполнении стека мне сообщили, что я использовал неправильные термины при задании вопроса. Я использовал "Родительский" и "дочерний", где я должен был использовать "базовый" и "производный" вместо этого.

Я не смог найти хорошее описание разницы.

Это то, что я знаю (или думаю, что знаю) так далеко:

родительский класс содержит дочерний класс. Где как производный класс наследуется от базового класса.

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

они разные, потому что вы можете сослаться на свойство дочернего класса в виде Parent.Child.Property. В то время как вы не можете сделать это с производным классом.

в чем разница и в какой ситуации нужно быть над другими?

8 ответов


родитель и ребенок более абстрактные отношения. Они используются для описания иерархии и, таким образом, могут использоваться во всех видах деревьев (или иногда DAG).
Дерево наследования класса является одним из таких деревьев, поэтому называя их родитель и ребенок не ошибается.
Эта терминология часто используется с другими видами деревьев, такими как вложенные элементы управления GUI, структуры каталогов,...

базовый и производные используется только для наследования, и, следовательно, более точной. Эта терминология предпочтительнее, поскольку она менее двусмысленна.


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

нижняя строка - чтобы понять, что подразумевается под родителем/ребенком, вы должны знать контекст.

в любом случае, разницу между двумя понятиями (наследование и инкапсуляция) можно рассматривать как "есть-А" и " имеет-а" отношение.

  • собака это животные (наследство)
  • автомобилем есть двигатель (заключения)

когда класс является производным от базового класса, он называется наследование. You inherit when you want to add functionality to an existing component, or extend the component.

когда класс ссылается/содержится в родительском классе, он называется инкапсуляция. You encapsulate when your (usually parent) object 'uses' components.

С Ext-наследование против инкапсуляции:

когда вы наследуете и когда вы инкапсулировать? Вы наследуете когда вы хотите добавить функциональность к существующему компоненту. Вы инкапсулируете когда ваш объект "использует" компоненты. Вы наследуете, если ваш новый класс " является а" компонента ВН. Вы инкапсулируете, если ваш новый класс "имеет" Ext Деталь.

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


производные в ООП esplicitly определяет полиморфные отношения между типами:

public class A{
}

public class AB : A{
}

класс AB производный класс A.

родитель и ребенок - это понятие аннотация отношения, которые в программировании могут получить разные формы, такие как:

public class A{
}

public class ParentA{
    List<A> children = ...
}

обычно используется в Graph отношения


родитель и ребенок связаны с принципом инкапсуляции OO, тогда как base и derived связаны с принципом наследования.

дочерний класс, инкапсулированный родительским классом, предоставляющий только общедоступные методы дочернего класса и не имеющий прямого доступа к родительскому классу.

производный класс имеет доступ ко всем свойствам, методы и члены базового класса, которые представлены как protected или более высокие модификаторы доступа.


"родитель "является синонимом" базы", а" ребенок "- синонимом" производного", но" родитель "и" ребенок " являются необычными и не очень техническими (и не звучат очень хорошо IMO). Два других термина - "суперкласс"и " подкласс".


основываясь на том, как вы используете Parent / Child, я думаю, что вы имеете в виду вложенные классы.

class Container
{
    class Nested
    {
    }
}

вложенный класс по умолчанию является частным. Цель здесь, как правило, что Nested будет вспомогательным классом, используемым Container. Например, Nested может использоваться методом в контейнере, который должен возвращать несколько значений. Пример Nested или Container потребуется ссылка на другой для доступа к любому из его нестатических членов.

, где в качестве производный класс наследуется от базового класса

class Base
{
}

class Derived : Base
{
}

производный класс имеет все функциональные возможности своего базового класса и может использоваться везде, где может использоваться базовый класс. Пример Derived имеет доступ ко всем public и protected нестатических членов. Base не имеет доступа ни к каким членам Derived. Кроме того, Derived может переопределять поведение виртуальных членов Base.


избегая терминологии parent / child я просто хочу упомянуть, что вложенный класс может иметь свой собственный содержащий ("внешний") класс в качестве базового класса. Я не думаю, что это шаблон, который люди используют очень много, но это разрешено на языке (C#).

пример:

class MyClass
{
  // we choose to make the instance constructor private
  MyClass()
  {
  }

  // nested type, private to MyClass, deriving from MyClass
  class InnerMyClass : MyClass
  {
    // ...
  }

  public static MyClass GetMyClassInstance()
  {
    return new InnerMyClass();
  }

  // ...
}