从子实例调用被重写的基类方法

时间:2008-10-28 21:12:14

标签: vb.net inheritance

请考虑以下代码:

Public Class Animal

Public Overridable Function Speak() As String
    Return "Hello"
End Function

End Class

Public Class Dog
    Inherits Animal

    Public Overrides Function Speak() As String
        Return "Ruff"
    End Function

End Class

Dim dog As New Dog
Dim animal As Animal
animal = CType(dog, Animal)
// Want "Hello", getting "Ruff"
animal.Speak()

如何将Dog的实例转换/ ctype为Animal并让Animal.Speak被调用?

5 个答案:

答案 0 :(得分:11)

你没有;子类的方法通过继承的定义覆盖了超类的方法。

如果希望重写的方法可用,请在子类中公开它,例如

Public Class Dog 
    Inherits Animal
    Public Overrides Function Speak() As String
        Return "Ruff"
    End Function
    Public Function SpeakAsAnimal() As String
        Return MyBase.Speak()
    End Function
End Class

答案 1 :(得分:1)

我会问你为什么要尝试这种行为。在我看来,你需要调用父类的方法实现这一事实表明你在系统的其他地方存在设计缺陷。

但是,正如其他人所说,根据您构建类的方式,无法调用父类的实现。现在在Dog类中你可以调用

MyBase.Speak()

会调用父类的实现,但是从Dog类外面没有办法实现它。

答案 2 :(得分:0)

我认为你不能。

事情是对象仍然是一只狗。你所描述的行为(从被铸造的对象而不是“你好”获得“ruff”)是标准的,因为你希望能够使用动物类让一群不同类型的动物说话。

例如,如果您有第三个类:

Public Class Cat
    Inherits Animal

    Public Overrides Function Speak() As String
        Return "Meow"
    End Function
End Class

然后你就可以这样访问它们了:

protected sub Something
    Dim oCat as New Cat
    Dim oDog as New Dog

    MakeSpeak(oCat)
    MakeSpeak(oDog)
End sub

protected sub MakeSpeak(ani as animal)
    Console.WriteLine(ani.Speak())
end sub 

你所说的基本上打破了继承链。现在,可以通过设置 Speak 函数来接受一个参数来完成它,这个参数告诉它返回它的基值,或者是一个单独的SPEAK函数作为基值,但开箱即用,你不会得到那种表现得像这样的东西。

答案 3 :(得分:0)

我认为如果您放弃“Overridable”并将“Overrides”更改为“New”,您将得到您想要的内容。

Public Class Animal

Public Function Speak() As String
    Return "Hello"
End Function

End Class

Public Class Dog
    Inherits Animal

    Public New Function Speak() As String
        Return "Ruff"
    End Function

End Class

Dim dog As New Dog
Dim animal As Animal
dog.Speak() ' should be "Ruff"
animal = CType(dog, Animal)
animal.Speak() ' should be "Hello"

答案 4 :(得分:0)

我知道这个已经发布了几个月,但我仍然会尝试回复,也许只是为了完整起见。

您被告知可以从 {/ 1}}类中的访问override方法,然后您可以使用其他名称公开它。但是如何使用条件?

你可以这样做:

dog

然后称他们为:

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

或者,您可以Dim dog As New Dog Dim animal As new Animal animal.Speak() //"Hello" dog.Speak()//"Ruff" dog.Speak(true)//"Hello" getTheAnimalInTheDog

你可以这样做:

Speak()

然后再说:

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

希望它有所帮助;)