如何将基类方法返回类型作为子类类型?

时间:2009-11-23 17:48:07

标签: .net vb.net generics inheritance interface

我有一个复制函数,我想在子类中重写它以返回子类的类型。这是我的界面:

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 覆盖复制时,它会返回 ICar ,这就是我想要的。但当丰田覆盖复制时,它还希望返回 ICar 而不是 IToyota 。如何编写它以返回 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 个答案:

答案 0 :(得分:3)

覆盖方法时,无法更改方法的返回类型。您可以省略overrides关键字来遮挡它,但它当然不再是虚拟的。

这不是一个大问题,除非您尝试使用ICar参考将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

答案 1 :(得分:0)

取出覆盖关键字

注意:界面无法实现该功能 - 您必须在那里实现它。接口仅“定义”函数将存在。

答案 2 :(得分: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

这是将方法隐藏在基类中的限制,但是使用相同的方法名称可以在派生类中返回更具体的对象的唯一方法。

答案 3 :(得分:0)

你可以让你的ICar界面更通用,如果我的vb.net代码没有达到标准,我会道歉。

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