【发布时间】:2020-04-15 17:44:29
【问题描述】:
我想创建一个实现多个接口的接口,然后创建一个实现该接口的类。例如:
IFlyable 模块:
Public Sub Fly()
End Sub
Public Function GetAltitude() As Long
End Function
ISwimmable 模块:
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 的类是行不通的。
鸭班:
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
按下编译按钮给了我错误: "编译错误:对象模块需要为接口'IFlySwim'实现'IFlyable_Fly'。
所以这让我相信Implement在另一个接口中使用一个接口是行不通的。或者至少,从 VBA 的角度来看,它没有意义。这是可以理解的,因为我实际上并没有在IFlySwim 中提供IFlyable 和ISwimmable 的实现。我真正想做的是将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
然后当我去使用它时,预测下拉菜单给了我:
我可以将Duck 转换为IFlyable 或ISwimmable 以这样使用:
但是如果我想创建一个接受 Flyable/Swimmable 的 Function 或 Sub 怎么办?我是否必须创建一个名为 IFlySwim 的完全独立的接口,其中包含来自IFlyable 和ISwimmable 的所有子/函数,然后修改我的Duck 类以仅从IFlySwim 实现?
【问题讨论】: