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

Иерархия классов

Управлять большим количеством разрозненных классов довольно сложно. С этой проблемой можно справиться путем упорядочивания и ранжирования классов, то есть объединяя общие для нескольких классов свойства в одном классе и используя его в качестве базового. Эту возможность предоставляет механизм наследования.

Наследование применяется для следующих взаимосвязанных целей:

  1. исключения из программы повторяющихся фрагментов кода;

  2. упрощения модификации программы;

  3. упрощения создания новых программ на основе существующих.

Наследование является единственной возможностью использовать объекты, исходный код которых недоступен, но в которые требуется внести изменения.

Кроме механизма наследования в данном разделе мы рассмотрим такие важные понятия ООП как полиморфизм и инкапсуляцию (см. лекцию 2), которые также принимают участие в формировании иерархии классов.

Наследование

Класс в С# может иметь произвольное количество потомков и только одного предка. При описании класса имя его предка записывается в заголовке класса после двоеточия. Если имя предка не указано, предком считается базовый класс всей иерархии System.Object. Синтаксис наследования:

[атрибуты] [спецификаторы] classимя_класса [: предки]

{ тело_класса}

Обратите внимание на то, что слово «предки» присутствует в описании класса во множественном числе, хотя класс может иметь только одного предка. Это связано с тем, что класс наряду с единственным предком-классом может наследовать интерфейсы (специальный вид классов, не имеющих реализации). Интерфейсы будут рассмотрены чуть позже.

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

Рассмотрим наследование классов на примере геометрических фигур на плоскости. В качестве базового класса создадим класс DemoPoint (точка на плоскости), в качестве производного класса отDemoPoint классDemoLine(отрезок на плоскости):

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

{

public int x;

public int y;

public void Show()

{

Console.WriteLine("({0}, {1})", x, y);

}

}

class DemoLine : DemoPoint //производный класс

{

public int xEnd;

public int yEnd;

public void Show()

{

Console.WriteLine("({0}, {1})-({2}, {3})", x, y ,xEnd, yEnd);

}

}

class Program

{

static void Main()

{

DemoPoint point = new DemoPoint();

point.x = 0;

point.y = 0;

point.Show();

DemoLine line = new DemoLine();

line.x = 2; line.y = 2;

line.xEnd = 10; line.yEnd = 10;

line.Show();

}

}

Экземпляр класса DemoLineс одинаковой легкостью использует как собственные поля и методы, так и унаследованные от классаDemoPoint. При этом, если метод производного класса называется также как и метод базового класса, то вызывается метод производного. Однако компилятором будет сгенерировано предупреждение:

Чтобы избежать подобного предупреждения необходимо перед одноименным членом производного класса, в данном случае перед методом Show в классе DemoLine, поставить спецификатор new. Данный спецификатор скрывает одноименный член базового класса и предупреждений выдаваться не будет.

Соседние файлы в папке 15