Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Наследование реализации

Наследование

В объектно-ориентированном программировании (ООП) существуют два различных типа наследования: наследование реализации и наследование интерфейса.

1. Наследование реализации (implementation inheritance) означает, что тип происходит от базового типа, получая от него все поля-члены и функции-члены. При наследовании реализации производный тип адаптирует реализацию каждой функции базового типа, если только в его определении не указано, что реализация функции должна быть переопределена. Такой тип наследования более полезен, когда нужно добавить функциональность к существующему типу или же когда несколько связанных типов разделяют существенный объем общей функциональности.

2. Наследование интерфейса (interface inheritance) означает, что тип наследует только сигнатуру функций, но не наследует никакой реализации. Этот тип наследования наиболее полезен, когда нужно специфицировать, что тип обеспечивает доступ к определенным средствам.

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

Некоторые языки, такие как C++, поддерживают то, что известно под названием множественного наследования, когда класс происходит более чем от одного базового класса. Преимущества множественного наследования спорны. С одной стороны, нет сомнений, что можно применять множественное наследование для написания чрезвычайно сложного, но при этом компактного кода, что демонстрирует библиотека C++ ATL. С другой стороны, код, использующий множественное наследование, часто трудно понять и сложно отлаживать (все это также демонстрирует библиотека C++ ATL). Как уже упоминалось, облегчение написания устойчивого кода было одной из ключевых целей проектирования С#. Соответственно, поэтому в С# множественное наследование не поддерживается. Однако С# позволяет типу наследовать множество интерфейсов. Это значит, что класс С# может наследоваться от другого класса и любого количества интерфейсов. На самом деле можно сказать точнее: благодаря наличию System.Object как всеобщего базового типа, каждый класс С# (за исключением Object) имеет строго один базовый класс и дополнительно может иметь любое количество базовых интерфейсов.

Для объявления, что класс наследуется от другого класса, применяется следующий синтаксис:

class УнаследованныйКласс: БазовыйКласс{ //Данные-члены и функции-члены}

Этот синтаксис очень похож на синтаксис C++ и Java. Однако программисты на C++, знакомые с концепцией общедоступного и приватного наследования, должны обратить внимание, что С# не поддерживает приватного наследования; этим объясняется отсутствие квалификатора public или private перед именем базового класса. Поддержка приватного наследования значительно усложняет язык, при этом принося весьма небольшую выгоду. На практике приватное наследование в C++ все равно используется чрезвычайно редко. Если класс также наследует интерфейсы, то список базового класса и интерфейсов

разделяется запятыми:

public class MyDerivedClass: MyBaseClass, Ilnterfacel, IInterface2{ // и т.д.}

Для структур синтаксис выглядит так:

public struct MyDerivedStruct: Ilnterfacel, IInterface2 { // и т.д. }

Если при определении класса базовый класс не указан, то компилятор С# предполагает, что базовым классом является System.Object. Поэтому следующие два фрагмента кода эквивалентны:

class MyClass: Object // наследуется от System.Object { // и т.д. }

и

class MyClass // наследуется от System.Object{// и т.д.}

Для простоты чаще применяется вторая форма.

Поскольку в С# поддерживается ключевое слово object, служащее псевдонимом класса System.Object, можно записать и так:

class MyClass: object // наследуется от System.Object{// и т.д.}

Чтобы сослаться на класс Object, используйте ключевое слово object, которое распознается интеллектуальными редакторами вроде Visual Studio.NET. Это облегчит редактирование кода.

<== предыдущая лекция | следующая лекция ==>
Другие модификаторы | Виртуальные методы
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 1130; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.014 сек.