C# 4.0 полное руководство - 2011
Шрифт:
Triangle tl = new Triangle; Triangle t2 = new Triangle;
tl.Width = 4.0;
tl.Height = 4.0;
tl.Style = "равнобедренный";
t2.Width = 8.0;
t2.Height = 12.0;
t2.Style = "прямоугольный";
tl.ShowStyle ; tl.ShowDim;
Console .WriteLine ("Площадь равна " + tl.AreaO);
Console.WriteLine;
Console.WriteLine("Сведения об объекте t2: "); t2.ShowStyle; t2.ShowDim;
Console.WriteLine("Площадь
}
}
При выполнении этой программы получается следующий результат.
Сведения об объекте tl:
Треугольник равнобедренный Ширина и высота равны 4 и 4 Площадь равна 8
Сведения об объекте t2:
Треугольник прямоугольный Ширина и высота равны 8 и 12 Площадь равна 48
В классе Triangle создается особый тип объекта класса TwoDShape (в данном случае — треугольник). Кроме того, в класс Triangle входят все члены класса TwoDShape, к которым, в частности, добавляются методы Area и ShowStyle . Так, описание типа треугольника сохраняется в переменной Style, метод Area рассчитывает и возвращает площадь треугольника, а метод ShowStyle отображает тип треугольника.
Обратите внимание на синтаксис, используемый в классе Triangle для наследования класса TwoDShape.
class Triangle : TwoDShape {
Этот синтаксис может быть обобщен. Всякий раз, когда один класс наследует от другого, после имени базового класса указывается имя производного класса, отделяемое двоеточием. В C# синтаксис наследования класса удивительно прост и удобен в использовании.
В класс Triangle входят все члены его базового класса TwoDShape, и поэтому в нем переменные Width и Height доступны для метода Area . Кроме того, объекты tl и t2 в методе Main могут обращаться непосредственно к переменным Width и Height, как будто они являются членами класса Triangle. На рис. 11.1 схематически показано, каким образом класс TwoDShape вводится в класс Triangle.
Рис. 11.1.
Несмотря на то что класс TwoDShape является базовым для класса Triangle, в то же время он представляет собой совершенно независимый и самодостаточный класс. Если класс служит базовым для производного класса, то это совсем не означает, что он не может быть использован самостоятельно. Например, следующий фрагмент кода считается вполне допустимым.
TwoDShape shape = new TwoDShape ; shape.Width = 10; shape.Height = 20;
shape.ShowDim;
Разумеется, объект класса TwoDShape никак не связан с любым из классов, производных от класса TwoDShape, и вообще не имеет к ним доступа.
Ниже приведена общая форма объявления класса, наследующего от базового класса.
class имя_производного_класса : имя_базового_класса {
// тело класса
}
Для любого производного класса можно указать только один базовый класс. В C# не предусмотрено наследование нескольких базовых классов в одном производном классе. (В этом отношении C# отличается от C++, где допускается наследование нескольких базовых классов. Данное обстоятельство следует принимать во внимание при переносе кода C++ в С#.) Тем не менее можно создать иерархию наследования, в которой производный класс становится базовым для другого производного класса. (Разумеется, ни один из классов не может быть базовым для самого себя как непосредственно, так и косвенно.) Но в любом случае производный класс наследует все члены своего базового класса, в том числе переменные экземпляра, методы, свойства и индексаторы.
Главное преимущество наследования заключается в следующем: как только будет создан базовый класс, в котором определены общие для множества объектов атрибуты, он может быть использован для создания любого числа более конкретных производных классов. А в каждом производном классе может быть точно выстроена своя собственная классификация. В качестве примера ниже приведен еще один класс, производный от класса TwoDShape и инкапсулирующий прямоугольники.
// Класс для прямоугольников, производный от класса TwoDShape. class Rectangle : TwoDShape {
// Возвратить логическое значение true, если // прямоугольник является квадратом, public bool IsSquare {
if(Width == Height) return true; return false;
}
// Возвратить площадь прямоугольника, public double Area { return Width * Height;
}
}