2016-02-24 5 views
1

Я заметил, что MSDN очень осторожно относится к терминам «наследовать» и «реализовывать».Наследуем ли мы или реализуем абстрактные классы?

Мы реализуем интерфейсы, но наследуем не-абстрактные классы. Я полагаю, что полные методы абстрактного класса наследуются, но реализуются абстрактные методы .

  • Какой термин следует использовать, если абстрактный класс состоит из полных и абстрактных методов? Абстрактный класс не имеет экземпляров с одной стороны (это характеристика интерфейса), с другой стороны, он может содержать полные методы (это характеристика класса).
+1

«extends» и «inherits from» используются в большинстве языков ООП для обозначения вывода из базового класса, независимо от того, является ли базовый класс абстрактным или нет, не меняет отношения. Добавление методов расширения является достаточным основанием, чтобы не путать вещи, используя «расширения» для отношений наследования при обсуждении .net, IMO. «реализует» всегда ссылается на реализацию интерфейса. –

+1

Предположим, вы должны использовать термин «переопределить» –

+0

Класс, который наследует от другого класса, может переопределять виртуальные методы его базового класса (и он * должен *, если эти методы являются абстрактными), но отношение наследования необязательно подразумевает переопределение поведение, например действительное (хотя и, вероятно, плохо продуманное ...) отношение наследования может включать только добавление дополнительных методов/полей в подкласс, без переопределения какого-либо поведения вообще. –

ответ

4

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

NO. Абстрактные методы (defintion) переопределяются методом переопределения базового класса.

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

Какой термин следует использовать, если абстрактный класс состоит из как полного , так и абстрактных методов?

Определение самого абстрактного класса гласит, что оно также может содержать методы defintions, но должно иметь хотя бы один абстрактный метод.

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

Аннотация Класс, очевидно, является категорией класса.

+0

Я не видел термин «протянуть» в .net. Можно создать абстрактный класс без абстрактных методов, и нет ошибок компиляции, я только что проверил его. – Spirit

+0

@Spirit вам не нужно было проверять. Я мог бы рассказать вам. Единственное слово «abstract» делает, оно препятствует созданию прямого экземпляра класса без наследования. В противном случае он может выглядеть как обычный класс, с конструктором и т. Д. Я имею в виду, потенциально.Конечно, другая вещь, которую он делает, позволяет использовать виртуальные методы. –

+1

Виртуальные методы могут быть определены для любого непечатаемого класса в C#, * абстрактные * методы могут быть определены только для абстрактных классов. –