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”类更难访问。

我需要MyControlClassPublic可以被其他项目使用,我也希望MyBaseClassandMyReturnTypeClass不能Friend被消费者看到/使用。我只是在某处遗漏了一些特殊的关键字,还是这不可能?

4

2 回答 2

2

基类必须至少与派生类一样可访问。这是语言限制(请参阅此处)。

如果您打算避免MyBaseClass被消费者实例化,请考虑标记它Public MustInherit而不是Friend. 希望这可以帮助。

于 2012-12-17T17:11:02.637 回答
2

您不能从比派生类更难访问的基类继承。因此,例如,这将不起作用:

Friend Class MyBase
End Class

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

因此,由于在您的示例中,MyBaseClass(T)has 是一个朋友类型,但您正试图从它继承到公共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 回答