我希望在实现类的子类时改变类的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
。我有办法做到这一点吗?
请注意,我需要classInstance
为MyBaseClass
- 如果我已将其声明为MyClassV0_0
,则此问题不会发生在我身上。
答案 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