Основы VB.NET Урок 14. Абстрактные классы
Часто мы имеем такую ситуацию - есть иерархия классов, и в каждом классе-потомке есть метод, который выполняет одно и то же действие. Но во всех класса-потомках это действие выполняется по-разному. В этом случае мы объявляем этот метод в классе-предке, но реализацию этого метода в классе-предке мы не пишем (а пишем отдельно в каждом классе-потомке). Класс-предок при этом мы объявляем как абстрактный. Создавать экземпляры такого класса нельзя - он используется только как предок для других классов в иерархии.
Поясним сказанное на примере. В этом примере есть класс Figure (геометрическая фигура). В нем есть метод Perim - для подсчета периметра фигуры. Понятно, что общей форулы для периметра нет (разве что через интеграл ;)) - для одной геометрической фигуры будет одна формула, для другой - другая. Поэтому мы объявляем наш класс Figure как абстрактный (с помощью ключевого слова MustInherit), а его метод Perim объявляем в классе без реализации (это делаем через ключевое слово MustOverride). Далее заводим два класса-потомка (Square (квадрат) и Rectangle (прямоугольник)), в которых и пишем реализацию метода Perim:
'Объявляем абстрактный класс
MustInherit Class Figure
Public MustOverride Function Perim() As Double
End Class
'Класс Square - потомок класса Figure
Class Square
Inherits Figure
'Сторона квадрата
Public a As Double
'Конструктор
Public Sub New(ByVal a1 As Integer)
a = a1
End Sub
'Реализуем метод Perim
Public Overrides Function Perim() As Double
Return a * 4
End Function
End Class
'Класс Rectangle - потомок класса Figure
Class Rectangle
Inherits Figure
'Стороны прямоугольника
Public a As Double, b As Double
'Конструктор
Public Sub New(ByVal a1 As Integer, ByVal b1 As Integer)
a = a1
b = b1
End Sub
'Реализуем метод Perim
Public Overrides Function Perim() As Double
Return (a + b) * 2
End Function
End Class
Обратите внимание, что метод Perim() мы объявили в родительском классе с ключевым словом MustOverride, а пишем его реализацию в дочених классах с ключевым словом Overrides.
Применить наши классы можно так:
Class Test
Public Shared Sub Main()
'Объявляем массив
Dim p(2) As Figure
p(0) = New Square(2)
p(1) = New Rectangle(2, 3)
Console.WriteLine(p(0).Perim())
Console.WriteLine(p(1).Perim())
End Sub
End Class
Видите - тут мы объявили массив из переменных типа родительского класса Figure. Далее мы в нулевой элемент массива записываем новый экземпляр класса Square, а в первый элемент - экземпляр класса Rectangle. Далее идет самое важное - мы вызываем метод Perim и выполняется конкретная реализация этого метода (или из класса Square, или из класса Rectangle). Выведет эта программа, естественно, 8 и 10.
|