我有一个复制函数,我想在子类中重写它以返回子类的类型。这是我的界面:
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
答案 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