2013-02-07 58 views
0

我爲MustInherit類vb.net爲MustInherit鑄造孩子

我創造的東西看起來像這樣

Sub OnLoad 
    ... 
     Dim o As Object = BaseX(Of Object).LoadItem 
     dim gv as Gridview = o.AddGridview(myPanel) 
    ... 
end Sub 

MustInherit Class BaseX(Of T1) 
    Public Shared Function LoadItem() As Object 
     ... 
      'Create Item FirstX or SecondX 
      'return the new Item 
     ... 
    End Function 

    Public Function GetGridview(ByVal container As Panel) As Gridview 
     'return a gridview 
    End Function 
End Class 

Class FirstX Inherits BaseX(of A) 
... 
End Class 

Class SecondX Inherits BaseX(of B) 
... 
End Class 

我的 「暗淡GV爲的GridView = o.AddGridview(myPanel)」

得到一個錯誤的工作

錯誤18延遲分辨率;運行時錯誤可能發生。

錯誤19警告視爲錯誤:延遲分辨率;運行時 可能會出現錯誤。

我嘗試

Dim gv As GridView = DirectCast(o, BaseX(Of Object)).AddGridview(myPanel) 

但我得到一個運行時錯誤

不能投的對象類型FirstX的類型BaseX

如果你有辦法走?我應該改變什麼?

回答

0

由於FirstX從BaseX(A)繼承,所以不能將BaseX(對象)轉換爲FirstX。 即使A繼承自Object,BaseX(Of Object)也不是BaseX(的A)的父級。

考慮一下:

Class A 
    public overrides Sub ToString() 
     Console.Writeline("A") 
    End Sub 
End Class 

Class FirstX Inherits BaseX(of A) 
    public overrides Sub ToString() 
     A.ToString() 
    End Sub 
End Class 

你可以看到BaseX(對象)的ToString()是不一樣的BaseX的ToString()的(A),這是兩個完全不同的班級裏面做不從另一個繼承。

要解決您的問題,您可以直接投射到FirstX或BaseX(的A)。爲了可擴展性,我建議創建一個由BaseX(T)實現的接口IBaseX。然後,你總是可以上傳到界面。

Interface IBaseX 
    Function GetGridview(ByVal container As Panel) As Gridview 
End Interface 

MustInherit Class BaseX(Of T1) 
    Implements IBaseX 

    Public Shared Function LoadItem() As Object 
     ... 
      'Create Item FirstX or SecondX 
      'return the new Item 
     ... 
    End Function 

    Public Function GetGridview(ByVal container As Panel) As Gridview 
     Implements IBaseX.GetGridView 
     'return a gridview 

    End Function 

End Class 

上溯造型:

Dim gv As GridView = CType(o, IBaseX).AddGridview(myPanel) 

注:這是VB.NET代碼,它可能不擅長在VB 6.0

工作