Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы ООП не все.docx
Скачиваний:
7
Добавлен:
22.09.2019
Размер:
224.93 Кб
Скачать

Вопрос 8 Наследование. Предпосылки появления. Типы наследования. Синтаксический блок.

Наследование — еще один важный механизм ООП, облегчающий повторное исполь­зование кода. Наследование позволяет определить новый класс путем расширения существу­ющего. Производный класс наследует элементы старого класса. При необходимости раз­личия между старым и новым классом можно указать двумя способами:

  1. Добавив новые элементы (функции и данные) к производному классу.

  2. Изменив поведение унаследованных функций за счет их новых реализаций.

Понятие наследования является основой еще одной важной концепции ООП — по­лиморфизма. Полиморфизм обеспечивает доступ к объектам разных типов с помощью одной пе­ременной. Это позволяет одному имени функции соответствовать нескольким различ­ным реализациям на этапе исполнения.

Предпосылки появления наследования

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

  1. Все три типа объектов можно рассматривать как автомобили и сделать все атри­буты общими. Таким образом, все три типа автомобилей будут экземплярами од­ного класса.

  2. Можно поступить наоборот — создать три класса.

Оба подхода можно заставить работать, однако у каждого из них есть серьезные не­достатки.

Сущест­вуют два различных типа наследования: наследование реализации и наследование интерфейса.

Наследование реализации (implementation inheritance) означает, что тип происходит от базового типа, получая от него все поля-члены и функции. При наследовании реализации производный тип адаптирует реализацию каждой функции базового типа, если только в его определении не указано, что реали­зация функции должна быть переопределена. Такой тип наследования более полезен, когда нужно добавить функциональность существующему типу, или же когда несколько связанных типов разделяют существенный объем общей функциональности. Хороший пример — набор классов Windows Forms, наряду с базовым классом System.Windows.Forms.Control, который представляет очень сложную реализацию общего элемента управления Windows, и многочисленными другими классами, такими как System.Windows.Forms.TextBox и System.Windows.Forms.ListBox, унас­ледованными от Control и переопределяющими его функции или опреде­ляющими новые функции для реализации специальных элементов управления.

Наследование интерфейса (interface inheritance) означает, что тип наследует только сигнатуру функций, но не наследует никакой реализации. Этот тип на­следования наиболее полезен, когда нужно специфицировать, что тип обеспе­чивает доступ к определенным средствам. Например, для некоторых типов может быть указано, что они представляют метод очистки ресурсов, называе­мый Dispose(), за счет того, что наследуют интерфейс System.Idisposable. Поскольку способ, которым один тип очищает ресурсы, скорее всего, будет очень отличаться от способа очистки ресурсов, используемого другим типом, нет смысла определять никакой общей реализации, а потому в данном случае подходит наследование интерфейса. Наследование интерфейса часто трактуется как выполнение контракта: наследуя интерфейс, тип берет на себя обязанность представить клиентам определенную функциональность.

Синтаксический блок наследования:

[<Спецификатор_доступности>] class <Имя_производного_класса> [ : <Имя_базового_класса>]

{

<Элементы_производного_класса>

}