Polimorfismo basato sull'ereditarietà

Aggiornamento: novembre 2007

Nella maggior parte dei sistemi di programmazione orientata ad oggetti, il polimorfismo viene ottenuto tramite l'ereditarietà. Il polimorfismo basato sull'ereditarietà comporta la definizione di metodi in una classe base e l'override degli stessi con nuove implementazioni nelle classi derivate.

È possibile ad esempio definire una classe BaseTax che fornisce la funzionalità di base per il calcolo dell'imposta sul fatturato in uno stato. Nelle classi derivate da BaseTax, come CountyTax o CityTax, è possibile implementare metodi quali CalculateTax in base alle necessità.

Il polimorfismo deriva dal fatto che è possibile chiamare il metodo CalculateTax di un oggetto appartenente a qualsiasi classe derivata da BaseTax, senza conoscere la classe di appartenenza dell'oggetto.

La routine TestPoly dell'esempio seguente consente di illustrare il polimorfismo basato sull'ereditarietà:

' %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

In questo esempio, la routine ShowTax accetta un parametro denominato Item di tipo BaseTax, ma è anche possibile passare qualsiasi classe derivata dalla classe BaseTax, ad esempio CityTax. Questa progettazione ha il vantaggio di consentire l'aggiunta di nuove classi derivate dalla classe BaseTax senza richiedere la modifica del codice client della routine ShowTax.

Vedere anche

Concetti

Polimorfismo basato sulle interfacce

Altre risorse

Progettazione di una gerarchia di ereditarietà