我有两个单独的类(A = BevelButtom 的子类,B = PushButton 的子类)。A 和 B 都以完全相同的方式实现了许多相同的方法。由于两个子类的超类是不同的,并且由于 RB 不支持多重继承,所以我能做的就是将这些方法绑定在一起定义一个类接口,让两个子类都实现该接口,然后复制/粘贴每个子类中的方法体。
这冒犯了我的感情。RB 有没有办法在其他地方提取这种通用逻辑?
谢谢!
我有两个单独的类(A = BevelButtom 的子类,B = PushButton 的子类)。A 和 B 都以完全相同的方式实现了许多相同的方法。由于两个子类的超类是不同的,并且由于 RB 不支持多重继承,所以我能做的就是将这些方法绑定在一起定义一个类接口,让两个子类都实现该接口,然后复制/粘贴每个子类中的方法体。
这冒犯了我的感情。RB 有没有办法在其他地方提取这种通用逻辑?
谢谢!
使用模块方法中的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 类。
使用接口似乎是正确的方法,但与其将方法体复制到每个子类,我认为用公共代码创建一个新类(比如 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