VBA继承模式
VBA是基于COM的,COM不进行继承。但我想我可能有一个模式,它近似于它的某些方面: Animal.clsVBA继承模式,vba,Vba,VBA是基于COM的,COM不进行继承。但我想我可能有一个模式,它近似于它的某些方面: Animal.cls Public Sub Speak() Err.Raise 418, , "Not supported" End Sub Dog.cls Implements Animal Private mBase As Animal Private Sub Class_Initialize() Set mBase = New Animal End Sub Priva
Public Sub Speak()
Err.Raise 418, , "Not supported"
End Sub
Dog.cls
Implements Animal
Private mBase As Animal
Private Sub Class_Initialize()
Set mBase = New Animal
End Sub
Private Sub Animal_Speak()
Me.Speak
End Sub
Public Sub Speak()
MsgBox "Woof!"
End Sub
Public Property Get Base() As Animal
Set Base = mBase
End Property
Test.bas
Sub Test()
Dim animal As animal: Set animal = New dog
Dim dog As dog: Set dog = New dog
Dim object As Object: Set object = New dog
dog.Speak ' direct : Woof!
animal.Speak ' polymorphic : Woof!
object.Speak ' late-bound : Woof!
dog.Base.Speak ' fake upcast : Err 418
End Sub
因此,Dog.cls中实现的接口成员Animal_Speak(它是私有的,以防止直接调用)将调用转发给public Speak方法,public Speak方法可以将其委托给Animal.cls中的等效子对象(“继承”)或替换为其他对象(“覆盖”)
此外,Dog.cls中的Base属性在调用方确实希望基本行为(向上转换)的情况下公开
(引用术语,因为它们只是近似值)
因此,我的问题是:
您正在实现的模式是一种组合形式,它是继承的常用代理,即使在支持类继承的语言中也是如此。你看,继承有它的缺点,组合往往比它更受欢迎 组合不需要接口。事实上,每当您在类中封装对象的实例,然后公开内部对象的部分(或全部)成员时,您都在使用组合 在您的特定示例中,您使用的是一个“抽象类”(
Animal
-接口),这没有多大意义,因为接口不需要像下面这样直接实例化:
在实际代码中,您可以有一个IRepository
接口,一个实现它的ProductSqlRepository
(然后是SupplierSqlRepository
,然后是OrderSqlRepository
,等等),您可以使用一些SqlRepository
类来组合实现,这些类公开所有实现使用的通用功能,每个实现都有自己的特定方式:同时,客户端代码只需要知道/关心IRepository
您正在通过接口继承发现VBA中多态性的可能性,这与类继承不同 通过类继承,您可以使用
virtual
甚至abstract
方法来重写派生类中的
使用.NET风格的接口继承,您可以拥有一个扩展另一个接口的接口,实现类型可以只实现该接口以满足编译器的要求—它公开它所扩展的所有接口的成员
通过VBA风格的接口继承,您可以得到一个可以实现接口的类。一两个。或者三个。或者更多。。。就像COM类型那样
那就是。。已经相当棒了
它被称为面向对象编程-OOP有4个功能:
- 抽象
- 封装
- 继承(sad VBA)
- 多态性
- [S] 单一责任原则
- [O] 笔/闭合原理
- [五十] 伊斯科夫代换原理
- [一] 界面分离原理
- [D] 依附反转原理
- Project Explorer唯一的文件夹是模块类型,因此包含许多类的项目很快就会成为导航噩梦
- 没有“转到实现”功能可以轻松定位接口的实现
- 没有重构工具
- 没有单元测试
- 没有静态代码分析
Set mBase = New Animal