Что дает переопределение методов
Благодаря переопределению методов в C# поддерживается динамический полиморфизм. В объектно-ориентированном программировании полиморфизм играет очень важную роль, потому что он позволяет определить в общем классе методы, которые становятся общими для всех производных от него классов, а в производных классах — определить конкретную реализацию некоторых или же всех этих методов. Переопределение методов — это еще один способ воплотить в C# главный принцип полиморфизма: один интерфейс — множество методов.
Удачное применение полиморфизма отчасти зависит от правильного понимания той особенности, что базовые и производные классы образуют иерархию, которая продвигается от меньшей к большей специализации. При надлежащем применении базовый класс предоставляет все необходимые элементы, которые могут использоваться в производном классе непосредственно. А с помощью виртуальных методов в базовом классе определяются те методы, которые могут быть самостоятельно реализованы в производном классе. Таким образом, сочетая наследование с виртуальными методами, можно определить в базовом классе общую форму методов, которые будут использоваться во всех его производных классах.
Применение виртуальных методов
Для того чтобы стали понятнее преимущества виртуальных методов, применим их в классе TwoDShape. В предыдущих примерах в каждом классе, производном от класса TwoDShape, определялся метод Area(). Но, по-видимому, метод Area() лучше было бы сделать виртуальным в классе TwoDShape и тем самым предоставить возможность переопределить его в каждом производном классе с учетом особенностей расчета площади той двумерной формы, которую инкапсулирует этот класс. Именно это и сделано в приведенном ниже примере программы. Ради удобства демонстрации классов в этой программе введено также свойство name в классе 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 x, 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";
}
Конструктор для класса 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, если
|
|
Дата добавления: 2019-02-12; просмотров: 241; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!