8

次のコードを検討してください。

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 のインスタンスを Animal に変換/ctype し、Animal.Speak を呼び出すにはどうすればよいですか?

4

5 に答える 5

13

あなたはそうしない; 継承の定義により、サブクラスのメソッドはスーパークラスのメソッドをオーバーライドします。

オーバーライドされたメソッドを利用可能にしたい場合は、サブクラスで公開します。

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
于 2008-10-28T21:21:48.177 に答える
1

なぜこの種の行動を取得しようとしているのかを尋ねます。親クラスのメソッドの実装を呼び出す必要があるという事実は、システムのどこかに設計上の欠陥があることを示しているように思えます。

ただし、他の人が述べているように、クラスを構造化した方法では、親クラスの実装を呼び出す方法はありません。これで、Dog クラス内で呼び出すことができます

MyBase.Speak()

これは親クラスの実装を呼び出しますが、Dog クラスの外からそれを行う方法はありません。

于 2008-10-28T22:01:10.923 に答える
0

「オーバーライド可能」を削除し、「オーバーライド」を「新規」に変更すると、必要なものが得られると思います。

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"
于 2008-11-26T15:33:18.610 に答える
0

私はあなたができるとは思わない。

問題は、オブジェクトがまだ犬であるということです。あなたが説明している動作 (キャストされたオブジェクトから "hello" ではなく "ruff" を取得する) は標準です。動物クラスを使用して、さまざまな種類の動物を話せるようにしたいからです。

たとえば、次のような 3 番目のクラスがあるとします。

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 関数を設定することによって実行できますが、箱から出してすぐに取得することはできません。このように振る舞うもの。

于 2008-10-28T21:23:53.273 に答える
0

これが数か月前に投稿されたことは知っていますが、おそらく完全を期すために、返信を試みるつもりです.

クラス内からオーバーライドされたメソッドにアクセスでき、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

そして再び:

Dim dog As New Dog
Dim animal As new Animal
animal.Speak() //"Hello"
dog.Speak()//"Ruff"
dog.GetTheAnimalInMe().Speak()//"Hello"

それが役に立てば幸い ;)

于 2014-12-22T08:34:06.797 に答える