Удачное применение полиморфизма отчасти зависит от правильного понимания той особенности, что базовые и производные классы образуют иерархию, которая продвигается от меньшей к большей специализации. При надлежащем применении базовый класс предоставляет все необходимые элементы, которые могут использоваться в производном классе непосредственно. А с помощью виртуальных методов в базовом классе определяются те методы, которые могут быть самостоятельно реализованы в производном классе. Таким образом, сочетая наследование с виртуальными методами, можно определить в базовом классе общую форму методов, которые будут использоваться во всех его производных классах.
Применение виртуальных методов
Для тогочтобы стали понятнее преимущества виртуальных методов, применим их в классеTwoDShape.В предыдущих примерах в каждом классе, производном от классаTwoDShape,определялся методArea(). Но, по-видимому, методArea() лучше было бы сделать виртуальным в классеTwoDShapeи тем самым предоставить возможность переопределить его в каждом производном классе с учетом особенностей расчета площади той двумерной формы, которую инкапсулирует этот класс. Именно это и сделано в приведенном ниже примере программы. Ради удобства демонстрации классов в этой программе введено также свойствопашев классеTwoDShape.
// Применить виртуальные методы и полиморфизм-.
using System;
class TwoDShape { double pri_width; double pri_height;
// Конструктор по умолчанию, public TwoDShape() {
Width = Height = 0.0; name = "null";
}
// Параметризированный конструктор.'
public TwoDShape(double w, double h, string n) {
Width = w;
Height = h; name = n;
}
// Сконструировать объект равной ширины и высоты, public TwoDShape(double х, string n) {
Width = Height = x; name = n;
}
// Сконструировать копию объекта TwoDShape. public TwoDShape(TwoDShape ob) {
Width = ob.Width;
Height = ob.Height; name = ob.name;
}
// Свойства ширины и высоты объекта, public double Width {
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);
}
public virtual double Area() {
Console.WriteLine("Метод Area() должен быть переопределен"); return 0.0;
}
}
// Класс для треугольников, производный от класса TwoDShape.
class Triangle : TwoDShape { string Style;
// Конструктор, используемый по умолчанию, public Triangle() {
Style = "null";
}