Ответы по Технологии программирования / Наследование как фундаментальный принцип ООП
.docxНаследование — один из трех фундаментальных принципов объектно-ориентированного программирования, именно благодаря ему возможно создание иерархических классификаций. Используя наследование, создают общийкласс, который определяет характеристики, присущие множеству связанных элементов. Этот класс затем может быть унаследован другими, узкоспециализированнымиклассами с добавлением в каждый из них своих, уникальных особенностей.
В языке С# класс, который наследуется, называется базовым. Класс, который наследует базовый класс, называется производным. Следовательно, производный класс —это специализированная версия базового класса. В производный класс, наследующийвсе переменные, методы, свойства, операторы и индексаторы, определенные в базовом классе, могут быть добавлены уникальные элементы.
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(), вычисляющий площадь прямоугольника.