3

免責事項:私はジェネリックを扱うのはかなり初めてなので、私がやろうとしていることが理にかなっている、または可能であるかどうかは完全にはわかりません.

プロジェクトに多数のユーザー コントロールがあります。これらのユーザー コントロールはすべて同様のプロパティを共有しているため、基本クラスに移動したいと考えています。唯一の違いは、プロパティの戻り値の型です。

このシナリオでは、相互作用する 3 つのクラスがあります。最初のクラスはCompositeControl、プロジェクト内の他のクラスから継承され、継承される基本型です。

Friend Class MyBaseClass(Of T As {New})
    Inherits CompositeControl

    Private _someProperty As T = Nothing

    Protected ReadOnly Property SomeProperty As T
        Get
            // dumbed down for the sake of example
            If _someProperty Is Nothing Then
                _someProperty = New T()
            End If

            Return _someProperty 
        End Get
    End Property
End Class

次に、から継承するこのコントロール クラスがありMyBaseClassます。

Public Class MyControlClass
    Inherits MyBaseClass(Of MyReturnTypeClass)

    // snip...
End Class

そして最後MyReturnTypeClassに、ベースSomePropertyが返すものは次のとおりです。

Friend Class MyReturnTypeClass
    Public Property AutoProperty1 As Boolean = False
    Public Property AutoProperty2 As String = String.Empty
    // etc
End Class

プロジェクトをビルドしようとすると、次のエラーが発生しますMyControlClass

一貫性のないアクセシビリティ: 型引数 'MyReturnTypeClass' は、クラス 'MyControlClass' よりもアクセシビリティが低くなります。

他のプロジェクトで消費できるようMyControlClassにする必要があります。また、消費者が見たり使用したりできないようにする必要があります。特別なキーワードがどこかに欠けているだけですか、それとも不可能ですか?PublicMyBaseClassMyReturnTypeClassFriend

4

2 に答える 2

2

派生クラスよりもアクセスしにくい基本クラスから継承することはできません。したがって、たとえば、これは機能しません。

Friend Class MyBase
End Class

Public Class MyDerived
    Inherits MyBase  ' Won't compile because MyBase is less accessible
End Class

したがって、あなたの例でMyBaseClass(T)は has はフレンド型ですが、それを public 型に継承しようとしていますMyControlClass。したがって、ジェネリックをMyReturnTypeClass「方程式」から外しても、まだ機能しません。

ただし、ジェネリックでは、クラスのパブリック インターフェイスのメンバーが実際にジェネリック型を使用しない場合でも、型は少なくとも派生型と同じくらいアクセス可能である必要があります。例えば:

Public Class MyBase(Of T)
    ' T not actually used at all
End Class

Friend Class MyOtherType
End Class

Public Class MyDerived
    Inherits MyBase(MyOtherType)  ' Won't compile because MyOtherType is less accessible
End Class
于 2012-12-17T17:15:29.087 に答える
2

基本クラスは、少なくとも派生クラスと同じくらいアクセス可能である必要があります。これは言語の制限です (こちらを参照)。

コンシューマーによるインスタンス化を回避する場合は、代わりにMyBaseClassマークすることを検討してください。お役に立てれば。Public MustInheritFriend

于 2012-12-17T17:11:02.637 に答える