Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ЛИПО .doc
Скачиваний:
0
Добавлен:
06.12.2018
Размер:
441.86 Кб
Скачать

Множественное наследование

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

Ранее была описана разница между структурами (типами значений) и классам (ссылочными типами). Одним из ограничений, налагаемых на структуры, является то, что они не поддерживают наследования, несмотря на тот факт, что каждая структура автоматически наследуется от System. ValueType. Структуры не поддерживают наследование реализации, но поддерживают наследование интерфейса. Таким образом, мы можем подытожить ситуацию с пользовательских типами следующим образом:

  • Структуры всегда наследуются от System.ValueType. Они могут также наследовать любое количество интерфейсов.

  • Классы всегда наследуются от одного класса по нашему выбору. Они также могут наследовать любое количество интерфейсов.

Наследование интерфейса

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

class УнаследованныйКласс : БазовыйКласс

{

//данные и функции-члены

}

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

Если класс (или структура) также наследует интерфейсы, то список базового класса и интерфейсов разделяется запятыми:

public class MyDerivedClass:MyBaseClass, Interfacel, Intexrface2

{

//и так далее.

}

Для структур синтаксис такой:

public struct MyDerivedStruct:Interfacel, Interface2

{

// и так далее.

}

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

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

{

//и так далее.

}

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

{

// и так далее.

}

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

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

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

{

// и так далее.

}

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