VB.NET - 在 child class 中扩展 属性

VB.NET - Extend property in child class

也许有人可以帮助我,我可以想象这是一个普遍的需求: 我有一个基地和一个 child class。基础 class 有一个名为 "hello" 的 属性。现在我需要在 child 的 属性 集中添加扩展功能 - 如何实现?

进一步解释的代码示例:

基础Class:

Public MustInherit Class Base

    Private pHello as String = ""

    Public Property Hello As String
        Get
            Return pHello
        End Get
        Set(ByVal value As String)
                pHello = value
                'DoSomethingInBaseClass()
                MsgBox "BaseClass calling!" 'Just for testing
        End Set
    End Property

End Class

Child Class

Public Class Child
    Inherits Base

    Public Property Hello As String
        Get
            Return MyBase.Hello
        End Get
        Set(ByVal value As String)
                'DoSomethingInCHILDClass()
                MsgBox "ChildClass calling!" 'Just for testing
        End Set
    End Property

End Class

属性 设置在 Main

Public Class Main

    Public Sub DoIt()
        Dim InstChild as new Child
        InstChild.Hello = "test"
    End Sub

End Class

基本上我想要的是,当设置 属性 时,我首先得到 Child MessageBox,然后是 Base MessageBox。

当然,我需要在 属性 定义中添加关键字。 我玩过 Shadows 和 Overrides,但我要么只得到 Child,要么只得到基本消息。

有没有办法同时获得两者?

非常感谢!

问题出在childclass。而不是 returning myBase.hello 只是 return Me.hello
因为起初 child class 的 me.hello 将等于 base classhello。因此,当您覆盖 属性 时,在 class 基础上它将保持不变,并且只会在 child class.
上发生变化,因此为了让你们俩都应该打电话:Base.Hello.get()Child.Hello.get()

我建议在可重写的函数中完成这项工作。这样你就可以让 child class 完成它的工作然后调用 MyBase.overriddenFunction().

例如:

基础Class

Public MustInherit Class Base

    Private pHello as String = ""

    Public Property Hello As String
        Get
            Return pHello
        End Get
        Set(ByVal value As String)
                pHello = value
                doSomething()
                MsgBox "BaseClass calling!" 'Just for testing
        End Set
    End Property

    Private Overridable Sub doSomething()
        'Do base class stuff
    End Sub

End Class

Child Class

Public Class Child
    Inherits Base

    Public Property Hello As String
        Get
            Return MyBase.Hello
        End Get
        Set(ByVal value As String)
                doSomething()
                MsgBox "ChildClass calling!" 'Just for testing
        End Set
    End Property

    Private Overrides Sub doSomething()
        'Do child class stuff
        MyBase.doSomething()
    End Sub

End Class