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

Ответы по Технологии программирования / Наследование как фундаментальный принцип ООП

.docx
Скачиваний:
7
Добавлен:
21.05.2015
Размер:
32.44 Кб
Скачать

Наследование — один из трех фундаментальных принципов объектно-ориентированного программирования, именно благодаря ему возможно создание иерархических классификаций. Используя наследование, создают общийкласс, который определяет характеристики, присущие множеству связанных элементов. Этот класс затем может быть унаследован другими, узкоспециализированнымиклассами с добавлением в каждый из них своих, уникальных особенностей.

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

5.1.1 Основы наследования

С# поддерживает наследование, позволяя в объявление класса встраивать другойкласс. Это реализуется посредством задания базового класса при объявлении производного. Рассмотрим класс TwoDShape, в котором определяются атрибуты "обобщенной" двумерной геометрической фигуры (например,квадрата, прямоугольника, треугольника и т.д.).

Класс TwoDShape можно использовать в качестве базового (т.е. как стартовую площадку) для классов, которые описывают специфические типы двумерных объектов. Например, класс TwoDShape используется для выведения класса Triangle.

// Простая иерархия классов.

usingSystem;

// Классдвумерныхобъектов,

classTwoDShape {

public double width;

public double height;

public void showDim() {

Console.WriteLine("Ширинаивысотаравны " +

width + " и " + height);

}}

// Класс Triangle выводится из класса TwoDShape.

class Triangle : TwoDShape {

public string style; // Типтреугольника.

// Метод возвращает площадь треугольника,

publicdoublearea() {

returnwidth * height / 2;

}

// Отображаем тип треугольника,

public void showStyle() {

Console.WriteLine("Треугольник " + style);

}}

class Shapes {

public static void Main() {

Triangle t1 = newTriangle();

Triangle t2 = new Triangle() ;

t1.width = 4.0;

t1.height- 4.0;

t1.style = "равнобедренный";

t2.width = 8.0;

t2.height = 12.0;

t2.style = "прямоугольный";

Console.WriteLine("Информацияо t1 : " ) ;

t1.showStyle();

t1.showDim();

Console.WriteLine ("Площадьравна " + t1.area());

Console.WriteLine();

Console.WriteLine("Информацияо t2: " ) ;

t2. showStyle() ;

t2.showDim();

Console.WriteLine("Площадьравна " + t2.area());

}}

Вот результаты работы этой программы.

Информация о tl:

Треугольник равнобедренный

Ширина и высота равны 4 и 4

Площадь равна 8

Информация о t2:

Треугольник прямоугольный

Ширина и высота равны 8 и 12

Площадь равна 4

В классе Triangle создается специфический тип объекта класса TwoDShape, в данном случае треугольник. Класс Triangle содержит все элементы класса TwoDShape и, кроме того, поле style, метод area() и метод showStyle(). В переменной style хранится описание типа треугольника, метод area () вычисляет и возвращает его площадь, а метод showstyle() отображает данные о типе треугольника.

Если один класс наследует другой, то имя базового класса указывается после имени производного, причем имена классов разделяются двоеточием. ВС# синтаксис наследования класса очень прост для запоминания и использования.

Поскольку класс Triangle включает все члены базового класса, TwoDShape, он может обращаться к членам width и height внутри метода агеа(). Кроме того, внутри метода Main() объекты t1 и t2 могут прямо ссылаться на члены width и height, как если бы они были частью класса Triangle. Включение класса TwoDShape в класс Triangle схематически показано на рис. 2.

Рисунок 2

Общая форма объявления класса, который наследует базовый класс, имеет такой вид:

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

// тело класса

}

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

ВС# (в отличие от C++) не поддерживается наследование нескольких базовых классов в одном производном классе.

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

Вот, например, как из базового класса TwoDShape можно вывести производный класс, который инкапсулирует прямоугольники:

// Класс прямоугольников Rectangle, производный

//от класса TwoDShape.

classRectangle :TwoDShape {

// Метод возвращает значение true, если

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

publicboolisSquare() {

if(width == height) returntrue;

returnfalse;

}

// Метод возвращает значение площади прямоугольника,

public double area() {

return width * height;

}}

Класс Rectangle включает класс TwoDShape и добавляет метод isSquare(), который определяет, является ли прямоугольник квадратом, и метод area(), вычисляющий площадь прямоугольника.