Style = "null";
}
// Конструктор, принимающий три аргумента, public Triangle(
string s, double w, double h) : base(w, h) {
Style = s;
}
// Сконструировать равнобедренный треугольник, public Triangle(double x) : base(x) {
Style = "равнобедренный";
}
// Возвратить площадь треугольника, public double Area() {
return Width * Height / 2;
}
// Показать тип треугольника, public void ShowStyleO {
Console.WriteLine("Треугольник " + Style);
}
}
class Shapes5 {
static void Main() {
Triangle tl = new Triangle();
Triangle t2 = new Triangle("прямоугольный", 8.0, 12.0);
Triangle t3 = new Triangle(4.0);
tl = t2;
Console.WriteLine("Сведения об объекте tclass="underline" "); tl.ShowStyle(); tl.ShowDim();
Console.WriteLine("Площадь равна " + tl.AreaO);
Console.WriteLine();
Console.WriteLine("Сведения об объекте t2: "); t2.ShowStyle (); t2.ShowDim();
Console.WriteLine("Площадь равна " + t2.Area());
Console.WriteLine();
Console.WriteLine("Сведения об объекте t3: "); t3.ShowStyle(); t3.ShowDim();
Console.WriteLine("Площадь равна " + t3.Area());
Console.WriteLine();
}
}
Вот к какому результату приводит выполнение этого кода.
Сведения об объекте tclass="underline"
Треугольник прямоугольный Ширина и высота равны 8 и 12 Площадь равна 48
Сведения об объекте t2:
Треугольник прямоугольный Ширина и высота равны 8 и 12 Площадь равна 48
Сведения об объекте t3:
Треугольник равнобедренный Ширина и высота равны 4 и 4 Площадь равна 8
А теперь рассмотрим вкратце основные принципы действия ключевого слова base. Когда в производном классе указывается ключевое слово base, вызывается конструктор из его непосредственного базового класса. Следовательно, ключевое слово base всегда обращается к базовому классу, стоящему в иерархии непосредственно над вызывающим классом. Это справедливо даже для многоуровневой иерархии классов. Аргументы передаются базовому конструктору в качестве аргументов метода base (). Если же ключевое слово отсутствует, то автоматически вызывается конструктор, используемый в базовом классе по умолчанию.
Наследование и сокрытие имен
В производном классе можно определить член с таким же именем, как и у члена его базового класса. В этом случае член базового класса скрывается в производном классе. И хотя формально в C# это не считается ошибкой, компилятор все же выдаст сообщение, предупреждающее о том, что имя скрывается. Если член базового класса требуется скрыть намеренно, то перед его именем следует указать ключевое слово new, чтобы избежать появления подобного предупреждающего сообщения. Следует,
однако, иметь в виду, что это совершенно отдельное применение ключевого слова new, не похожее на его применение при создании экземпляра объекта.
Ниже приведен пример сокрытия имени.
// Пример сокрытия имени с наследственной связью.
using System;
class А {
public int i = 0;
}
// Создать производный класс. j
class В : A { *
new int i; // этот член скрывает член i из класса А public В(int b) {
i = Ь; // член i в классе В
}
public void Show() {
Console.WriteLine("Член i в производном классе: " + i) ;
}
}
class NameHiding { static void Main() {
В ob = new В(2);
ob.Show() ;
}
}
Прежде всего обратите внимание на использование ключевого слова new в следующей строке кода.
new int i; // этот член скрывает член i из класса А
В этой строке компилятору, по существу, сообщается о том, что вновь создаваемая переменная i намеренно скрывает переменную i из базового класса А и что автору программы об этом известно. Если же опустить ключевое слово new в этой строке кода, то компилятор выдаст предупреждающее сообщение.
Вот к какому результату приводит выполнение приведенного выше кода.
Член i в производном классе: 2
В классе В определяется собственная переменная экземпляра i, которая скрывает переменную i из базового класса А. Поэтому при вызове метода Show () для объекта типа В выводится значение переменной i, определенной в классе В, а не той, что определена в классе А.