Sé que esto ha sido publicado hace unos meses, pero todavía voy a tratar de responder, tal vez sólo por el bien de la completitud.
Le han dicho que se puede acceder desde el método sobreescrito dentro de la clase dog
, y que a continuación, puede exponerse con un nombre diferente. Pero, ¿qué pasa con el uso de un condicional?
Sólo puede hacer:
Public Class Animal
Public Overridable Function Speak(Optional ByVal speakNormal as Boolean = False) As String
Return "Hello"
End Function
End Class
Public Class Dog
Inherits Animal
Public Overrides Function Speak(Optional ByVal speakNormal as Boolean = False) As String
If speakNormal then
return MyBase.Speak()
Else
Return "Ruff"
End If
End Function
End Class
y luego llamar a ellos como:
Dim dog As New Dog
Dim animal As new Animal
animal.Speak() //"Hello"
dog.Speak()//"Ruff"
dog.Speak(true)//"Hello"
Como alternativa, puede getTheAnimalInTheDog
y hacer queSpeak()
:
Sólo puede hacer:
Public Class Animal
Public Overridable Function Speak() As String
Return "Hello"
End Function
Public MustOverride Function GetTheAnimalInMe() As Animal
End Class
Public Class Dog
Inherits Animal
Public Overrides Function Speak() As String
Return "Ruff"
End Function
Public Overrides Function GetTheAnimalInMe() As Animal
Dim a As New Animal
//Load a with the necessary custom parameters (if any)
Return a
End Function
End Class
Y luego otra vez:
Dim dog As New Dog
Dim animal As new Animal
animal.Speak() //"Hello"
dog.Speak()//"Ruff"
dog.GetTheAnimalInMe().Speak()//"Hello"
creo que sirve;)
"Otra alternativa, es declarar el objeto como un animal y, a continuación, echar a un perro cuando se necesita propiedades extendidas de los perros " Esa última parte no es verdad. El tipo declarado de la variable no tiene sentido cuando se trata de cómo una instancia determinada se comporta polimórficamente. –
Eso es cierto, estaba pensando en términos de interfaces. –