Vb.net 将友元类作为类型从公共类传递到友元基类时出错

Vb.net 将友元类作为类型从公共类传递到友元基类时出错,vb.net,generics,inheritance,user-controls,Vb.net,Generics,Inheritance,User Controls,免责声明:我对使用泛型相当陌生,所以我不能完全确定我所尝试的方法是否有意义或可能 我在一个项目中有很多用户控件。所有这些用户控件共享一个类似的属性,因此我想将其移动到基类中。唯一的区别是属性的返回类型 我有三个类在这个场景中交互。第一个类是基类型,它继承自CompositeControl,并将被我的项目中的其他类继承: Friend Class MyBaseClass(Of T As {New}) Inherits CompositeControl Private _someP

免责声明:我对使用泛型相当陌生,所以我不能完全确定我所尝试的方法是否有意义或可能

我在一个项目中有很多用户控件。所有这些用户控件共享一个类似的属性,因此我想将其移动到基类中。唯一的区别是属性的返回类型

我有三个类在这个场景中交互。第一个类是基类型,它继承自
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
成为
Public
,这样它就可以被其他项目使用,我还希望
MyBaseClass
MyReturnTypeClass
成为
Friend
,这样消费者就看不到/使用它们。我只是在某个地方漏掉了一些特殊的关键字,还是不可能

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


如果您想避免“代码> MyBaseClass <代码>被消费者实例化,请考虑标记它<代码>公共继承继承< <代码>,而不是<代码>朋友< /代码>。希望这有帮助。

您不能从比派生类更难访问的基类继承。例如,这是行不通的:

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

这就解释了为什么我的代码不会编译,但没有提供任何替代方案?除了将
MyReturnTypeClass
标记为
Public
之外,我没有其他选择吗?是的,如果它将成为公共派生类的基类,那么它也必须是Public。正如channs指出的,您可以将MustInherit修饰符添加到基类中,以便其他项目无法直接使用它。