c# - 覆盖子类中的 ReadOnly 属性以使其读/写(VB.NET 或 C#)

标签 c# vb.net inheritance properties readonly

这在带有属性的 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/

相关文章:

json - 使用提供的证书发送 json 文档

c++ - 如何获取 ATL DLL 中的 HWND(用于 SendMessage 或 PostMessage)

asp.net - VB.NET 接口(interface)

c++ - arduino c++ 中的继承问题

c# - const int 列表而不是枚举

c# - WCF 在 Post 方法中给出错误 400 Bad Request

c++ - C++ 中的 instanceof 等价物

java - 嵌套泛型继承

c# - 程序在启动后几乎立即崩溃

c# - 如何对Azure存储表进行批量操作?