// Сконструировать копию объекта типа 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() ;

}

}

> t

Как показывает представленный выше пример программы, во всех производных классах методArea() должен быть непременно переопределен, а также объявлен абстрактным. Убедитесь в этом сами, попробовав создать производный класс, в котором не переопределен методArea (). В итоге вы получите сообщение об ошибке во время компиляции. Конечно, возможность создавать ссылки на объекты типаTwoDShapeпо-прежнему существует, и это было сделано в приведенном выше примере программы, но объявлять объекты типаTwoDShapeуже нельзя. Именно поэтому массивshapesсокращен в методеMain() до 4 элементов, а объект типаTwoDShapeдля общей двухмерной формы больше не создается.

Обратите также внимание на то, что в классTwoDShapeпо-прежнему входит методShowDim() и что он не объявляется с модификаторомabstract.В абстрактные классы вполне допускается (и часто практикуется) включать конкретные методы, которые могут быть использованы в своем исходном виде в производном классе. А переопределению в производных классах подлежат только те методы, которые объявлены какabstract.

Предотвращение наследования с помощью ключевого слова sealed

Несмотря на всю эффективность и полезность наследования, иногда возникает потребность предотвратить его. Допустим, что имеется класс, инкапсулирующий последовательность инициализации некоторого специального оборудования, например медицинского монитора. В этом случае требуется, чтобы пользователи данного класса не могли изменять порядок инициализации монитора, чтобы исключить его неправильную настройку. Но независимо от конкретных причин в C# имеется возможность предотвратить наследование класса с помощью ключевого слова sealed.

Перейти на страницу:

Похожие книги