0

私は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

「dim gv as Gridview = o.AddGridview(myPanel)」でエラーが発生しました

エラー 18 レイト バウンドの解決。実行時エラーが発生する可能性があります。

エラー 19 エラーとして処理される警告: レイト バウンド解決。実行時エラーが発生する可能性があります。

私は試します

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

しかし、実行時エラーが発生しました

オブジェクト型 FirstX を BaseX 型にキャストできません

行く方法がある場合は?何を変更すればよいですか?

4

1 に答える 1

0

FirstXはBaseX(of A)から継承されるため、BaseX(of Object)をFirstXにキャストすることはできません。AはObjectから継承しますが、BaseX(Of Object)はBaseX(of 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(Of Object).ToString()はBaseX(of A).ToString()と同じではなく、互いに継承しない2つの完全に異なるクラスであることがわかります。

問題を解決するには、FirstXまたはBaseX(of A)に直接キャストします。拡張性のために、BaseX(of T)によって実装されるインターフェイスIBaseXを作成することをお勧めします。そうすれば、uはいつでもインターフェイスにアップキャストできます。

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コードであり、ExcelVB6.0では機能しない可能性があります

于 2013-02-07T21:36:03.100 に答える