2009-11-23 64 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 
相關問題