设置或覆盖基类的只读 属性
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
。我有办法做到这一点吗?
请注意,我需要 classInstance
为 MyBaseClass
— 如果我将其声明为 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
我想在 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
。我有办法做到这一点吗?
请注意,我需要 classInstance
为 MyBaseClass
— 如果我将其声明为 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