класса указываем уже существующий класс, на основе которого мы созда-
ем новый класс. Делается такое указание с помощью небольшой добавки
к коду создаваемого класса. Класс, на основе которого создается новый
класс, называется
класса, называется
ПРИМЕЧАНИЕ Иногда базовый класс называют суперклассом, а производный —
подклассом. Но эта терминология скорее относится к 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. Но, чтобы по-
нять, что он из себя представляет, необходимо сначала разобраться с ба-