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

时间:2016-08-20 11:01:04

标签: vb.net inheritance properties readonly

我希望在实现类的子类时改变类的ReadOnly属性(即属性取决于它属于哪个类)。

目前,我有:

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,则此问题不会发生在我身上。

2 个答案:

答案 0 :(得分:1)

Shadows允许某个成员在基数不允许被覆盖的情况下由派生再次定义(并且仅在实例用作派生类型时使用)

这里你需要的是使基类成员Overridable(或MustOverride在这里作为基类是MustInherit并且基类似乎不需要默认实现)和Overrides在派生的

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

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

如果某个类的所有实例的名称相同,那么它应该是Shared字段,但这也意味着您将从类而不是从实例访问它

MyBaseClass.Name
MyClassV0_0.Name

你仍然拥有一个字段可以做的是拥有一个私有构造函数,并使用提供的值从派生类中调用该构造函数:

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

答案 1 :(得分:0)

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