设置或覆盖基类的只读 属性

Set or override readonly property of baseclass

我想在 class 实现子 class 时对 class 进行 ReadOnly 属性 更改(即 属性 取决于它属于 class。

目前,我有:

Public MustInherit Class MyBaseClass

    Public ReadOnly name As String

    ...

    Sub New()
            name = "None"
    End Sub
End Class

Public Class MyClassV0_0 : Inherits MyBaseClass

    Public Shadows ReadOnly name As String

    ...

    Sub New()
            name = "MyClass v0.0"
    End Sub
End Class

在我的主代码中调用它时,我得到了这些结果:

Dim classInstance As MyBaseClass = New MyClassV0_0

Debug.Print(classInstance.name)

调试打印:None

但是,我希望打印 MyClass v0.0。我有办法做到这一点吗?

请注意,我需要 classInstanceMyBaseClass — 如果我将其声明为 MyClassV0_0,则我不会出现此问题。

Shadows 允许派生在基类不允许重写时再次定义某些成员(并且仅在实例用作派生类型时使用)

这里你需要做的是使基础成员Overridable(或这里的MustOverride因为基础class是MustInherit而且似乎不是基 class 需要一个默认实现)和 Overrides 它在派生

为此,名称应该是 属性 而不是字段

Public MustInherit Class MyBaseClass
    Public MustOverride ReadOnly Property Name As String
End Class

Public Class MyClassV0_0 : Inherits MyBaseClass
    Public Overrides ReadOnly Property Name As String = "MyClass v0.0"
End Class

如果 class 的所有实例的名称都相同,也许它应该是 Shared 字段,但这也意味着您将从 class 而不是从实例

MyBaseClass.Name
MyClassV0_0.Name

您仍然可以拥有一个字段的方法是拥有一个私有构造函数,并使用提供的值从派生的 class 调用该构造函数,如下所示:

Public MustInherit Class MyBaseClass
    Public ReadOnly Name As String

    Protected Sub New(name As String)
        Me.Name = name
    End Sub
End Class

Public Class MyClassV0_0 : Inherits MyBaseClass
    Private Sub New(name As String)
        MyBase.new(name) ' call base ctor which can initialize ReadOnly field
    End Sub

    Public Sub New()
        Me.New("MyClassV0.0") ' call private ctor of the current class
    End Sub
End Class

Sehnsucht 在对我有用的评论中建议的代码(目前使用 VB 2010)。解决方案是改用 属性。

Public MustInherit Class MyBaseClass

    Public MustOverride ReadOnly Property name As String

    ...

End Class

Public Class MyClassV0_0 : Inherits MyBaseClass

    Public Overrides ReadOnly Property name As String
        Get
            Return "MyClass v0.0"
        End Get
    End Property

    ...

End Class