鉴于您想要完成的任务以及您发布的示例代码,VB.NET 不会让您这样做。
通常,您可以在 VB.NET 中声明属性,如下所示:
Public Class qwqwqw
Public Property xyz() As String
Get
Return ""
End Get
Private Set(ByVal value As String)
'
End Set
End Property
End Class
基本上将整个属性标记为公共,但为 setter(或 getter)提供更严格的范围。
您的情况的主要问题是 MustInherit (即抽象)基类。由于您在其中定义的属性被标记为 MustOverride,因此您无法提供默认实现(即它也是抽象的),并且这包括“Get”和“Set”轮廓,因此,无论“总体” “你给这个抽象属性声明的范围,VB.NET将强制你使用这个范围both派生类中的 getter 和 setter。
在基类的属性上使用 ReadOnly 限定符将强制所有派生类和该属性的实现也为 ReadOnly。忽略 ReadOnly 限定符仍然不起作用,因为无论您为抽象属性赋予什么范围,都将是您必须应用于派生实现中的 setter 和 getter 的范围。
例如:
Public MustInherit Class Parent
Public MustOverride Property Foo() As String
End Class
Public Class ReadOnlyChild
Inherits Parent
Public Overrides Property Foo() As String
Get
'
End Get
Private Set(ByVal value As String)
'
End Set
End Property
End Class
(注意设置器上的私有范围)。这不会起作用,因为 VB.NET 坚持认为,由于您要重写基类属性,因此整个属性必须与您要重写的属性具有相同的范围(在本例中为公共)。
尝试使基类的抽象属性受保护也不起作用,因为您将需要在与基类中声明的相同范围级别(即受保护)实现该属性。通常,当不使用特定范围级别覆盖基类的抽象定义时,您可以为 getter 或 setter 提供一个more限制性范围级别,但你不能给它一个less限制性范围级别。
所以:
Public MustInherit Class Parent
Protected MustOverride Property Foo() As String
End Class
Public Class ReadOnlyChild
Inherits Parent
Protected Overrides Property Foo() As String
Public Get
'
End Get
Set(ByVal value As String)
'
End Set
End Property
End Class
(注意 getter 的公共作用域)。也不起作用,因为 public 作用域比 protected 的整体属性范围限制更少,而且与基类的抽象属性声明中定义的作用域级别不同。
如果您的类的设计正如您在问题中提到的那样,我个人会使用“java风格”的getter和settermethods因为它们可以用自己的范围级别单独声明。