【问题标题】:REALbasic: Sharing common code between disparate subclassesREALbasic:在不同的子类之间共享公共代码
【发布时间】:2013-01-04 06:01:14
【问题描述】:

我有两个单独的类(A = BevelButtom 的子类,B = PushButton 的子类)。 A 和 B 都以完全相同的方式实现了许多相同的方法。由于两个子类的超类是不同的,并且由于 RB 不支持多重继承,我可以做的就是将这些方法绑定在一起定义一个类接口,让两个子类都实现该接口,然后复制/粘贴每个子类中的方法体。

这冒犯了我的感情。 RB中有没有办法在其他地方提取这种通用逻辑?

谢谢!

【问题讨论】:

    标签: realbasic realstudio


    【解决方案1】:

    使用模块方法中的Extends 语法来扩展类接口。您仍然需要使用类接口,但是这样所有的公共代码都可以放在模块中,而不是跨多个类重复。

    Interface FooInterface
      Sub Foo()
    End Interface
    
    Class Foo
    Implements FooInterface
      Sub Foo()
        MsgBox("Foo!")
      End Sub
    End Class
    
    Class Bar
    Implements FooInterface
      Sub Foo()
        MsgBox("Bar!")
      End Sub
    End Class
    
    Module FooExtensions
      Sub Foobar(Extends FooImplementor As FooInterface)
        MsgBox("Foobar!")
      End Sub
    End Module
    

    上面的 FooBar 方法将像任何实现 FooInterface 类接口的类的类方法一样被调用:

    Dim myfoo As FooInterface = New Bar
    myfoo.Foobar()
    

    请注意,当编译器决定给定类是否满足接口时,扩展方法不计入

    但是,这可能不可行,因为扩展方法只能访问接口而不是实际的类。

    或者,您可以扩展 RectControl 类,尽管这将包括所有桌面控件,而不仅仅是 PushButton 和 BevelButton。

    第三种选择可能是专门使用 BevelButton 类。

    【讨论】:

    • 感谢您的回答。不幸的是,我确实需要访问各个类(因为它们有一些共同的属性)。我想我可以让扩展方法将它们的接口转换为特定的类(使用明智的IsA),但这仍然感觉很粗糙......
    • 您的回答帮了很多忙。我接受保罗的回答,因为它更符合我的确切情况,但我非常感谢你的努力。如果我能奖励两个答案,我会心跳加速。
    【解决方案2】:

    使用接口似乎是正确的方法,但与其将方法体复制到每个子类,我认为使用通用代码创建一个新类(例如 CommonButtonStuff)更有意义。然后你可以在实现的方法中调用它:

    CommonButtonInterface
      Sub Method1
    
    Class CommonButtonHandler
      Sub DoMethod1
        MsgBox("Do it!")
      End Sub
    
    Class A Inherits From PushButton, Implements CommonButtonInterface
      Private Property mCommonStuff As CommonButtonHandler
    
      Sub Constructor
        mCommonStuff = New CommonButtonHandler
      End Sub
    
      Sub Method1
        mCommonStuff.DoMethod1
      End Sub
    
    Class B Inherits From BevelButton, Implements CommonButtonInterface
      Private Property mCommonStuff As CommonButtonHandler
    
      Sub Constructor
        mCommonStuff = New CommonButtonHandler
      End Sub
    
      Sub Method1
        mCommonStuff.DoMethod1
      End Sub
    

    【讨论】:

    • 谢谢你,保罗 - 非常感谢你的回音!如果您不介意,问一个简单的问题:与@Amazed 描述的 Module 方法相比,您喜欢这种方法的哪一点?
    • 我想这取决于你需要做什么。类比模块更强大,并且有自己的实例,因此它们可以让您设计更健壮的东西。哎呀,您可以结合这两种技术,以便分别扩展 PushButton 和 BevelButton,但让它们调用模块或类中的公共代码并放弃接口。
    • 知道了。这很有意义(今天早上,我也有类似的想法,认为类更健壮);另外,如果接口只是为了定义无实现的合约,那么它们在这种情况下的使用让我感到困扰。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2019-11-11
    • 1970-01-01
    • 2017-07-27
    • 2023-01-18
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多