2

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

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

谢谢!

4

2 回答 2

3

使用模块方法中的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 类。

于 2013-01-04T06:47:07.853 回答
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
于 2013-01-04T15:42:36.510 回答