get { return pri_width; }
set { pri_width = value < 0 ? -value : value; }
}
public double Height {
get { return pri_height; }
set { pri_height = value < 0 ? -value : value; }
}
public string name { get; set; }
public void ShowDim() {
Console.WriteLine("Ширина и высота равны " +
Width + " и " + Height);
}
// Теперь метод Area() является абстрактным,
public abstract double Area();
}
// Класс для треугольников, производный от класса TwoDShape.
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;
}
// Переопределить метод Area() для класса Triangle,
public override double Area() {
return Width * Height / 2;
}
// Показать тип треугольника,
public void ShowStyle() {
Console.WriteLine("Треугольник " + Style);
}
}
// Класс для прямоугольников, производный от класса TwoDShape
class Rectangle : TwoDShape {
// Конструктор для класса Rectangle,
public Rectangle(double w, double h)
: base(w, h, "прямоугольник"){ }
// Сконструировать квадрат,
public Rectangle(double x) : base (x, "прямоугольник") { }
// Сконструировать копию объекта типа Rectangle,
public Rectangle(Rectangle ob) : base(ob) { }
// Возвратить логическое значение true, если
// прямоугольник окажется квадратом,
public
bool IsSquare() {
if(Width == Height) return true;
return false;
}
// Переопределить метод Area() для класса Rectangle,
public override double Area() {
return Width * Height;
}
}
class AbsShape {
static void Main() {
TwoDShape[] shapes = new TwoDShape[4];
shapes[0] = new Triangle("прямоугольный", 8.0, 12.0);
shapes[1] = new Rectangle(10) ;
shapes[2] = new Rectangle(10, 4);
shapes[3] = new Triangle(7.0);
for(int i=0; i < shapes.Length; i++) {
Console.WriteLine("Объект — " + shapes[i].name);
Console.WriteLine("Площадь равна " + shapes[i].Area());
Console.WriteLine() ;
}
}
}
Как показывает представленный выше пример программы, во всех производных классах метод Area()
должен быть непременно переопределен, а также объявлен абстрактным. Убедитесь в этом сами, попробовав создать производный класс, в котором не переопределен метод Area()
. В итоге вы получите сообщение об ошибке во время компиляции. Конечно, возможность создавать ссылки на объекты типа TwoDShape
по-прежнему существует, и это было сделано в приведенном выше примере программы, но объявлять объекты типа TwoDShape
уже нельзя. Именно поэтому массив shapes
сокращен в методе Main()
до 4 элементов, а объект типа TwoDShape
для общей двухмерной формы больше не создается.