Я хотел бы создать интерфейс, который реализует несколько интерфейсов, а затем создать класс, который реализует этот интерфейс. Например:
IFlyable модуль:
Public Sub Fly()
End Sub
Public Function GetAltitude() As Long
End Function
ISИзменяемый модуль:
Public Sub Swim()
End Sub
Public Function GetDepth() As Long
End Function
Модуль IFlySwim:
Implements IFlyable
Implements ISwimmable
Public Sub IFlyable_Fly()
End Sub
Public Function IFlyable_GetAltitude() As Long
End Function
Public Sub ISwimmable_Swim()
End Sub
Public Function ISwimmable_GetDepth() As Long
End Function
Все это прекрасно компилируется , Но если я объявляю объект типа IFlySwim, предиктивный текст в VBA дает мне:

И попытка создать класс, реализующий IFlySwimmable, просто не не работает.
Class Duck:
Implements IFlySwim
Public Sub IFlySwim_IFlyable_Fly()
Debug.Print "Flying with wings!"
End Sub
Public Function IFlySwim_IFlyable_GetAltitude() As Long
IFlySwim_IFlyable_GetAltitude = 30
End Function
Public Sub IFlySwim_ISwimmable_Swim()
Debug.Print "Swimming with feet!"
End Sub
Public Function IFlySwim_ISwimmable_GetDepth() As Long
IFlySwim_ISwimmable_GetDepth = 20
End Function
При нажатии на кнопку компиляции выдается сообщение об ошибке: «Ошибка компиляции: объектному модулю необходимо реализовать IFlyable_Fly для интерфейса« IFlySwim ».
Так что это заставляет меня поверить, что Implement
использование интерфейса в другом интерфейсе не работает. Или, по крайней мере, это не имеет смысла с точки зрения VBA. Это понятно, потому что я на самом деле не предоставляет реализацию для IFlyable
и ISwimmable
в IFlySwim
. Что я действительно хочу сделать, так это отложить реализацию для IFlyable
и ISwimmable
до класса, который реализует оба из них.
Так что теперь, если мой Duck
класс:
Implements IFlyable
Implements ISwimmable
Public Sub IFlyable_Fly()
Debug.Print "Flying with wings!"
End Sub
Public Function IFlyable_GetAltitude() As Long
IFlyable_GetAltitude = 30
End Function
Public Sub ISwimmable_Swim()
Debug.Print "Swimming with feet!"
End Sub
Public Function ISwimmable_GetDepth() As Long
ISwimmable_GetDepth = 20
End Function
Тогда, когда я go его использую, прогнозирующий выпадающий список дает мне:

Я мог бы разыграть Duck
или IFlyable
или ISwimmable
нам e как таковой:

Но что, если я хотел создать функцию или вспомогательный модуль, который принимает Flyable / Swimmable? Нужно ли мне создавать совершенно отдельный интерфейс IFlySwim, который содержит все подфункции / функции из IFlyable
и ISwimmable
, а затем изменить мой класс Duck
так, чтобы он реализовывался только из IFlySwim
?