class Triangle : TwoDShape {
string Style;
// Конструктор, используемый по умолчанию,
public Triangle() {
Style = "null";
}
// Конструктор для класса Triangle.
public Triangle(string s, double w, double h) : base(w, h) {
Style = s;
}
// Сконструировать равнобедренный треугольник,
public Triangle(double x) : base(x) {
Style = "равнобедренный";
}
// Сконструировать копию объекта типа Triangle,
public Triangle(Triangle ob) : base(ob) {
Style = ob.Style;
}
// Возвратить площадь треугольника,
public double Area() {
return Width * Height / 2;
}
// Показать тип треугольника,
public void ShowStyle() {
Console.WriteLine("Треугольник " + Style);
}
}
class Shapes7 {
static void Main() {
Triangle t1 = new Triangle("прямоугольный", 8.0, 12.0);
// Сделать копию объекта t1.
Triangle t2 = new Triangle (t1) ;
Console.WriteLine("Сведения об объекте t1: ");
t1.ShowStyle();
t1.ShowDim();
Console.WriteLine ("Площадь равна " + t1.Area());
Console.WriteLine();
Console.WriteLine("Сведения об объекте t2: ");
t2.ShowStyle();
t2.ShowDim();
Console.WriteLine("Площадь равна " + t2.Area());
}
}
В представленном выше примере объект t2
конструируется из объекта t1
поэтому подобен ему. Ниже приведен результат'выполнения кода из данного примера.
Сведения об объекте t1:
Треугольник прямоугольный
Ширина и высота равны 8 и 12
Площадь равна 48
Сведения об объекте t2:
Треугольник прямоугольный
Ширина и высота равны 8 и 12
Площадь равна 48
Обратите особое внимание на следующий конструктор класса Triangle:
public Triangle(Triangle ob) : base(ob) {
Style = ob.Style;
}
Он принимает объект типа Triangle
в качестве своего параметра и передает его (с помощью ключевого слова base
) следующему конструктору класса TwoDShape
.
public TwoDShape(TwoDShape ob) {
Width = ob.Width;
Height = ob.Height;
}
Самое любопытное, что конструктор TwoDShape()
предполагает получить объект класса TwoDShape
, тогда как конструктор Triangle()
передает ему объект класса Triangle
. Как пояснялось выше, такое вполне допустимо, поскольку по ссылке на объект базового класса можно обращаться к объекту производного класса. Следовательно, конструктору TwoDShape()
можно на совершенно законных основаниях передать ссылку на объект класса, производного от класса TwoDShape
. А поскольку конструктор TwoDShape()
инициализирует только те части объекта производного класса, которые являются членами класса TwoDShape
, то для него не имеет никакого значения, содержит ли этот объект другие члены, добавленные в производном классе.
Виртуальные методы и их переопределение