2013-02-07 63 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

工作