2009-11-23 63 views
1

我有一个复制函数,我想在子类中重写以返回子类的类型。这里是我的接口:如何获得一个基类方法的返回类型是子类的类型?

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 

这里是我的课程。正如你所看到的,当汽车覆盖复制它返回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 

回答

3

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

这不是一个大问题,除非你尝试使用ICAR参照丰田对象复制到丰田参考:

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

取出覆盖关键字

注:界面无法实现的功能 - 你将必须实现它在那里。只有一个接口“定义”该函数将存在。

0

您无法重写某些内容并返回更具体的对象。如果你想这样做,你需要使用Shadows关键字,但如果你有一个实际的丰田变量,那么它只会返回IToyota,而不是如果你的变量是Car类型的,但包含一个丰田对象。例如:

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

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

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

0

你可以让你ICAR接口更通用,道歉,如果我的VB。网络代码没有达到要求。

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 
相关问题