这在带有属性的 VB.NET 中似乎是不可能的,因为属性声明本身必须描述它是否为 ReadOnly
。
在我下面的示例中,它不允许我编译 ReadWriteChild
。我想我可以让父级读/写,然后让 ReadOnlyChild 的 setter 不做任何事情,但这似乎有点老套。在这种情况下,最好的替代方案似乎是放弃属性以支持 getter/setter 方法。
Public MustInherit Class Parent
Public MustOverride ReadOnly Property Foo() As String
End Class
Public Class ReadOnlyChild
Inherits Parent
Public Overrides ReadOnly Property Foo() As String
Get
' Get the Property
End Get
End Property
End Class
Public Class ReadWriteChild
Inherits Parent
Public Overrides Property Foo() As String
Get
' Get the property.
End Get
Set(ByVal value As String)
' Set the property.
End Set
End Property
End Class
最佳答案
考虑到您要完成的任务以及您发布的示例代码,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
基本上将整个属性标记为公共(public)属性,但为 setter(或 getter)提供更严格的范围。
您案例中的主要问题是 MustInherit(即抽象)基类。由于您在其中定义的属性被标记为 MustOverride,因此您无法提供默认实现(即它也是抽象的),并且这包括“获取”和“设置”大纲,因此,无论哪个“总体” "您赋予此抽象属性声明的范围,VB.NET 将强制您将此范围用于派生类中的 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
(注意 setter 上的 Private 范围)。这是行不通的,因为 VB.NET 坚持认为,由于您要覆盖基类属性,因此您的整个属性必须与您要覆盖的属性具有相同的范围(在本例中为公共(public)属性)。
尝试使基类的抽象属性 protected 也不会起作用,因为您将需要在与基类中声明的相同范围级别(即 protected )中实现该属性。通常,当不使用特定范围级别覆盖基类的抽象定义时,您可以为 getter 或 setter 提供更多限制性范围级别,但不能给它更少 限制范围级别。
因此:
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)范围)。也不起作用,因为公共(public)范围比 protected 整体属性范围限制更少,而且,与基类的抽象属性声明中定义的范围级别不同。
如果你的类的设计如你在问题中提到的那样,我个人会选择“java 风格”的 getter 和 setter 方法,因为它们可以用自己的方法单独声明范围级别。
关于c# - 覆盖子类中的 ReadOnly 属性以使其读/写(VB.NET 或 C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/554369/