【问题标题】:VB.NET - Extend property in child classVB.NET - 在子类中扩展属性
【发布时间】:2015-05-22 17:45:08
【问题描述】:

也许有人可以帮助我,我可以想象这是一个共同的需求: 我有一个基类和一个子类。基类有一个名为“hello”的属性。现在我需要在子属性 Set 中添加扩展功能 - 我该如何实现?

进一步解释的代码示例:

基类:

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

儿童班

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

基本上我想要的是,在设置属性时,我首先获得子消息框,然后是基本消息框。

当然我需要在属性定义中添加一个关键字。 我玩过 Shadows 和 Overrides,但要么只得到 Child,要么只得到 Base Message。

有没有办法两者兼得?

非常感谢!

【问题讨论】:

    标签: vb.net inheritance properties expand


    【解决方案1】:

    我建议在可覆盖的函数中完成这项工作。这样您就可以让子类完成其工作,然后调用 MyBase.overriddenFunction()。

    例如:

    基类

    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
    

    儿童班

    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
    

    【讨论】:

    • 非常感谢!这很好用!我认为会有一个更清洁的解决方案,但至少这种解决方法在功能上是可行的。
    【解决方案2】:

    问题出在子类中。而不是返回myBase.hello,只需返回Me.hello
    因为起初子类的me.hello 将等于base classhello。因此,当您覆盖该属性时,在基类中它将保持不变,并且只会在子类上更改。
    因此,为了让你们俩都应该调用:Base.Hello.get()Child.Hello.get()

    【讨论】:

    • 感谢您的快速回复!我希望我对您的理解正确,但是在 Child Get 中将其更改为 me.hello 会导致递归调用。无论如何,我的问题出在集合中。我希望首先调用子集,然后调用基集。不幸的是我不能投票给你,我的代表太低了:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    相关资源
    最近更新 更多