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.

Другие вопросы по тегам