Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_rab_6.doc
Скачиваний:
35
Добавлен:
29.10.2018
Размер:
148.99 Кб
Скачать

Лабораторная работа 6 Тема: Наследование классов

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

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

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

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

Базовые и производные классы

Часто объект одного класса также “является” объектом другого класса. Например, автомобиль является транспортным средством, прямоугольник является четырехугольником, студент является человеком. Применительно к языку C# отношение “является” (is a) представляет наследование реализации, или простое наследование.

Один базовый класс может иметь много производных классов; следовательно, набор объектов, представленный базовым классом, как правило, больше, чем набор объектов, представленных любым из его производных классов. Например, в отношении транспортное средство − автомобиль класс Vehicle (транспортное класс средство) может быть базовым, а класс Car (автомобиль) − производным, так как класс Vehicle представляет собой любые транспортные средства, включая автомобили, паромы, поезда, самолеты т.д. Производный же класс Car представляет только небольшое множество всех транспортных средств.

При описании производного класса имя его базового класса указывается в заголовке после двоеточия. Синтаксис объявления производного класса имеет вид:

[спецификатор доступа] [модификатор класса]

class имя_производного_класса : базовый класс

{

тело_класса

}

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

Рассмотрим следующий фрагмент программы:

class A { // базовый класс

int a; // закрытое поле базового класса

// методы базового класса

public A () // конструктор класса A

{…}

public void F()

{…}

}

class B : A { // производный класс

int b; // закрытое поле производного класса

// методы производного класса

public B () // конструктор класса A

{…}

public void G()

{…}

}

В этом фрагменте программы производный класс B наследует такие элементы класса A, как свойство a и метод F() и добавляет к ним собственные элементы: свойство b и метод G().

Примечание. Конструкторы классов не наследуются, подробнее об этом − в подразд. 8.1.2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]