класса указываем уже существующий класс, на основе которого мы созда-

ем новый класс. Делается такое указание с помощью небольшой добавки

к коду создаваемого класса. Класс, на основе которого создается новый

класс, называется базовым. Класс, который создается на основе базового

класса, называется производным классом.

ПРИМЕЧАНИЕ Иногда базовый класс называют суперклассом, а производный —

подклассом. Но эта терминология скорее относится к Java.

Для того чтобы создать новый класс на основе уже существующего, в опи-

сании нового (производного) класса после имени класса через двоеточие

указывается базовый класс. Другими словами, синтаксис создания произ-

водного класса такой:

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

// код производного класса

}

В результате наследования вся «начинка» базового класса автоматически

переносится в производный класс. Другими словами, производный класс

в подарок от базового получает все поля и методы базового класса. Кроме

полученного наследства, производный класс может содержать описание

дополнительных членов. Более того, в производном классе только допол-

нительные члены и описываются.

Идиллию нарушают закрытые члены базового класса, то есть те члены

базового класса, которые описаны с атрибутом private или вообще без

идентификатора уровня доступа. Такие члены класса, по большому

счету, наследуются производным классом, но у него нет к ним доступа.

Другими словами, в программном коде производного класса нельзя

обратиться к private-члену базового класса. При этом непрямая ссылка

возможна. Например, в базовом классе есть закрытое поле и открытый

метод, который обращается к этому полю. В производном классе мы

можем вызвать открытый метод, но не можем обратиться к закрытому

полю. Вместе с тем этот самый открытый метод преспокойно обраща-

ется к закрытому полю. Вот такой парадокс (который, разумеется, на

самом деле парадоксом не является).

Помимо ключевых слов pubic и private, есть ключевое слово protected, которое используют для создания защищенных членов класса. Если

речь не идет о наследовании, то между закрытыми и защищенными

74

Глава 2. Классы и объекты

членами класса разницы нет — они доступны внутри класса и не-

доступны за его пределами. А вот при наследовании защищенные

члены класса проявляют свою хитрую сущность — они наследуются, становясь защищенными членами производного класса.

Также можно запретить использовать класс в качестве базового. Если

класс описать с атрибутом sealed, на основе такого класса произво-

дный класс создать не удастся.

В качестве базового класса можно использовать как свои собственные (на-

писанные собственноручно) классы, так и уже готовые, библиотечные.

Рассмотрим программный код, представленный в листинге 2.5.

Листинг 2.5.  Наследование классов

using System;

// Базовый класс:

class Box{

// Закрытое поле:

private int size;

// Закрытый метод для присваивания значения полю:

private void set(int size){

this.size=size;

}

// Защищенный метод для отображения

// консольного сообщения:

protected void show(){

string str="\nКоробка с размером ребра "+size+" см"; Console.WriteLine(str);

}

// Конструктор баз аргументов:

public Box():this(10){}

// Конструктор с одним аргументом:

public Box(int size){

// Присваиваем значение полю:

set(size);

}

}

// Производный класс от класса Box:

class ColoredBox:Box{

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

private string color;

// Закрытый метод для отображения значений полей:

private void showAll(){

// Отображаем "размер":

show();

// Отображаем "цвет":

Наследование и уровни доступа           75

Console.WriteLine("Цвет: "+color);

}

// Конструктор производного класса

// без аргументов:

public ColoredBox():base(){

color="красный";

// Отображаем сообщение:

showAll();

}

// Конструктор производного класса

// с одним аргументом:

public ColoredBox(int size):base(size){

color="желтый";

// Отображаем сообщение:

showAll();

}

// Конструктор производного класса

// с двумя аргументами:

public ColoredBox(int size,string color):base(size){

this.color=color;

// Отображаем сообщение:

showAll();

}

}

// Класс с главным методом:

class ExtDemo{

// Главный метод программы:

public static void Main(){

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

ColoredBox redBox,yellowBox,greenBox;

// Создание объектов производного класса:

redBox=new ColoredBox();

yellowBox=new ColoredBox(100);

greenBox=new ColoredBox(1000,"зеленый");

Console.ReadLine();

}

}

Идея очень простая: сначала создаем базовый класс (который называет-

ся Box), а затем на его основе производный класс (который называется

ColoredBox).

ПРИМЕЧАНИЕ В названиях классов сокрыт глубокий философский смысл. Класс

Box  как  бы  описывает  коробку  (кубическую,  у  которой  все  ребра

одинаковые), а класс ColoredBox как бы описывает раскрашенную

коробку. Без этих классов работа картонно-коробочной промышлен-

ности крайне затруднительна.

76

Глава 2. Классы и объекты

Нас, собственно, интересует производный класс ColoredBox. Но, чтобы по-

нять, что он из себя представляет, необходимо сначала разобраться с ба-

Перейти на страницу:

Похожие книги