gpt4 book ai didi

vb.net - 将 friend 类作为类型从公共(public)类传递到 friend 基类时出错

转载 作者:行者123 更新时间:2023-12-01 12:48:42 26 4
gpt4 key购买 nike

免责声明:我对使用泛型还很陌生,所以我不确定我正在尝试做的事情是否有意义或是否可行。

我在一个项目中有一堆用户控件。所有这些用户控件都共享一个相似的属性,所以我想将它移到一个基类中。唯一的区别是属性的返回类型。

在这种情况下,我有三个类进行交互。第一个类是一个基类,它继承自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 得到了这个错误:

Inconsistent accessibility: type argument 'MyReturnTypeClass' is less accessible than Class 'MyControlClass'.

我需要 MyControlClassPublic 以便它可以被其他项目使用,我还想要 MyBaseClassMyReturnTypeClass 成为 Friend 这样他们就不会被消费者看到/使用。我只是在某处遗漏了一些特殊关键字还是不可能?

最佳答案

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

Friend Class MyBase
End Class

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

因此,因为在您的示例中,MyBaseClass(T) 是一个友元类型,但您正试图从它继承到公共(public) MyControlClass 类型。因此,即使您将泛型和 MyReturnTypeClass 从“等式”中剔除,它仍然行不通。

但是,对于泛型,即使类的公共(public)接口(interface)中没有成员实际使用泛型类型,该类型仍必须至少与派生类型一样可访问。例如:

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

关于vb.net - 将 friend 类作为类型从公共(public)类传递到 friend 基类时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13918392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com