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修饰符添加到基类中,以便其他项目无法直接使用它。