logo
lab_rab_6

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

Часто объект одного класса также “является” объектом другого класса. Например, автомобиль является транспортным средством, прямоугольник является четырехугольником, студент является человеком. Применительно к языку 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.