REALbasic: совместное использование общего кода между разнородными подклассами
У меня есть два отдельных класса (A = подкласс BevelButtom, B = подкласс PushButton). И A, и B реализуют несколько идентичных методов совершенно одинаково. Поскольку суперклассы обоих подклассов различны и поскольку RB не поддерживает множественное наследование, все, что я могу сделать, чтобы связать эти методы вместе, это определить интерфейс класса, заставить оба подкласса реализовать интерфейс, а затем скопировать / вставить тела методов в каждом подклассе.
Это оскорбляет мои чувства. Есть ли способ в РБ извлечь эту общую логику в другом месте?
Спасибо!
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
Используйте синтаксис 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.