1


0

基本クラスメソッドの戻り値の型をサブクラス型にするにはどうすればよいですか?

サブクラスの型を返すためにサブクラスでオーバーライドしたいコピー関数があります。 私のインターフェイスは次のとおりです。

Public Interface IBase(Of T)
    Function Copy() As T
End Interface

Public Interface ICar
    Inherits IBase(Of ICar)
End Interface

Public Interface IToyota
    Inherits ICar
End Interface

そして、これが私のクラスです。 ご覧のとおり、* Car Copy をオーバーライドすると、 ICar が返されます。 ただし、 Toyota Copy をオーバーライドする場合、 IToyota の代わりに ICar *を返します。 * IToyota *を返すように書くにはどうすればよいですか?

Public MustInherit Class Base(Of T)
    Implements IBase(Of T)

    Protected MustOverride Function Copy() As T Implements IBase(Of T).Copy

End Class

Public Class Car
    Inherits Base(Of ICar)
    Implements ICar

    Protected Overrides Function Copy() As ICar
        Return Nothing  //'TODO: Implement Copy
    End Function
End Class

Public Class Toyota
    Inherits Car
    Implements IToyota

    Protected Overrides Function Copy() As IToyota Implements IToyota.Copy
        //'I want this to return IToyota, but gives me a compile error
    End Function

End Class

4 Answer


3


メソッドをオーバーライドするとき、メソッドの戻り値の型を変更することはできません。 代わりに「overrides」キーワードを省略してシャドウすることもできますが、それはもちろんもはや仮想ではありません。

ICar参照を使用してToyotaオブジェクトをToyota参照にコピーしない限り、これは大きな問題ではありません。

Dim a As IToyota = New Toyota()
Dim b As IToyota = a.Copy() ' works

Dim c As ICar = New Toyota()
Dim d As IToyota = c.Copy() ' doesn't work


0


overridesキーワードを削除します

NOTE the interface can’t implement the function — you will have to すぐに実装します。 インターフェイスは、関数が存在することを「定義」するだけです。


0


何かをオーバーライドして、より具体的なオブジェクトを返すことはできません。 これを行うには、Shadowsキーワードを使用する必要がありますが、実際のトヨタ変数がある場合にのみIToyotaが返されます。変数がCarタイプであるがToyotaオブジェクトが含まれている場合ではありません。 例えば:

Dim MyToyotaVariable as Toyota = New Toyota
MyToyotaVariable.Copy() 'Returns IToyota

Dim MyToyotaVariable as Car = New Toyota
MyToyotaVariable.Copy() 'Returns ICar

これは、基本クラスでメソッドを非表示にすることの制限ですが、同じメソッド名を使用して、派生クラスでより具体的なオブジェクトを返すことができる唯一の方法です。


0


私のvb.netコードがスクラッチになっていない場合は、お使いのICarインターフェイスをより一般的なものにすることができます。

Public Interface IBase(Of T)
    Function Copy() As T
End Interface

Public Interface ICar(Of T)
    Inherits IBase(Of T)
End Interface

Public Interface IToyota
    Inherits ICar(Of IToyota)
End Interface