Compartir a través de


Polimorfismo basado en la herencia

Actualización: noviembre 2007

La mayoría de los sistemas de programación orientada a objetos proporcionan polimorfismo a través de la herencia. El polimorfismo basado en la herencia implica definir métodos en una clase base y reemplazarlos con nuevas implementaciones en clases derivadas.

Por ejemplo, podría definir una clase, BaseTax, que proporciona la funcionalidad básica para calcular los impuestos sobre ventas en un estado. Las clases derivadas de BaseTax, como CountyTax o CityTax, podrían implementar métodos como CalculateTax según las necesidades.

El polimorfismo se deriva del hecho de que se podría llamar al método CalculateTax de un objeto perteneciente a cualquier clase derivada de BaseTax, sin saber a qué clase pertenecía el objeto.

El procedimiento TestPoly del siguiente ejemplo muestra el polimorfismo basado en la herencia:

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

En este ejemplo, el procedimiento ShowTax acepta un parámetro denominado Item de tipo BaseTax, pero también puede pasar cualquiera de las clases derivadas de la clase BaseTax, como CityTax. La ventaja de este diseño es que se pueden agregar nuevas clases derivadas de la clase BaseTax sin cambiar el código cliente en el procedimiento ShowTax.

Vea también

Conceptos

Polimorfismo basado en la interfaz

Otros recursos

Diseñar una jerarquía de herencia