Поделиться через


Полиморфизм на основе наследования

Обновлен: Ноябрь 2007

Большинство объектно-ориентированных систем программирования обеспечивают полиморфизм посредством наследования. Полиморфизм на основе наследования включает в себя определение методов в базовом классе и их переопределение при помощи новых реализаций в производных классах.

Например, можно определить класс, BaseTax, который предоставляет базовые функциональные возможности для вычисления налога с продаж в стране. Классы, производные от BaseTax, например, CountyTax или CityTax, могут реализовать такие методы, как CalculateTax как соответствующие.

Полиморфизм основан на том, что Вы можете вызвать метод CalculateTax объекта, принадлежащего любому классу, производному от BaseTax, не зная, к какому классу объект принадлежит.

Процедура TestPoly в следующем примере наглядно демонстрирует полиморфизм на основе наследования:

' %5.3 State tax
Const StateRate As Double = 0.053
' %2.8 City tax
Const CityRate As Double = 0.028
Public Class BaseTax
    Overridable Function CalculateTax(ByVal Amount As Double) As Double
        ' Calculate state tax.
        Return Amount * StateRate
    End Function
End Class

Public Class CityTax
    ' This method calls a method in the base class 
    ' and modifies the returned value.
    Inherits BaseTax
    Private BaseAmount As Double
    Overrides Function CalculateTax(ByVal Amount As Double) As Double
        ' Some cities apply a tax to the total cost of purchases,
        ' including other taxes. 
        BaseAmount = MyBase.CalculateTax(Amount)
        Return CityRate * (BaseAmount + Amount) + BaseAmount
    End Function
End Class

Sub TestPoly()
    Dim Item1 As New BaseTax
    Dim Item2 As New CityTax
    ' $22.74 normal purchase.
    ShowTax(Item1, 22.74)
    ' $22.74 city purchase.
    ShowTax(Item2, 22.74)
End Sub

Sub ShowTax(ByVal Item As BaseTax, ByVal SaleAmount As Double)
    ' Item is declared as BaseTax, but you can 
    ' pass an item of type CityTax instead.
    Dim TaxAmount As Double
    TaxAmount = Item.CalculateTax(SaleAmount)
    MsgBox("The tax is: " & Format(TaxAmount, "C"))
End Sub

В этом примере процедура ShowTax принимает параметр с именем Item типа BaseTax, но можно также передать любой из классов, производных от класса BaseTax, например CityTax. Преимуществом этого макета заключается в том, что можно добавить новые классы, производные от класса BaseTax без изменения кода клиента в процедуре ShowTax.

См. также

Основные понятия

Полиморфизм на основе интерфейсов

Другие ресурсы

Разработка иерархии наследования