gpt4 book ai didi

VBA继承模式

转载 作者:行者123 更新时间:2023-12-04 00:51:37 27 4
gpt4 key购买 nike

VBA 是基于 COM 的,而 COM 不进行继承。但我想我可能有一个近似于它的某些方面的模式:

动物文件

Public Sub Speak() 
Err.Raise 418, , "Not supported"
End Sub

狗.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

测试数据库
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 中实现的接口(interface)成员 Animal_Speak(这是私有(private)的以防止直接调用它)将调用转发到公共(public) Speak 方法,该方法可以将其委托(delegate)给 Animal.cls 中的等效子(“继承”)或用其他东西替换它(“覆盖”)。

此外,Dog.cls 中的 Base 属性是公开的,以防调用者确实想要基本行为(“向上转换”)。

(引号中的术语,因为它们只是近似值)。

所以,我的问题是:
  • 这是一种已知的模式,如果是,它是否普遍?
  • 有什么缺点吗?
  • 最佳答案

    您正在实现的模式是一种组合形式,它是一种常用的继承代理,即使在支持类继承的语言中也是如此。你会看到继承有它的缺点,而组合通常比它更受欢迎。

    组合不需要接口(interface)。事实上,每当您将对象的实例封装在一个类中,然后公开部分(或全部)内部对象的成员时,您就是在使用组合。

    在您的具体示例中,您正在使用“抽象类”( Animal - 接口(interface))进行组合,这没有多大意义,因为接口(interface)并不意味着像这样直接实例化:

    Set mBase = New Animal


    在真正的代码中,你可以有一个 IRepository接口(interface),一个 ProductSqlRepository实现它(然后是 SupplierSqlRepository 然后是 OrderSqlRepository 等),你可以用一些 SqlRepository 组合实现公开所有实现使用的通用功能的类,每个都以自己的特定方式:同时客户端代码只需要知道/关心 IRepository .

    您正在通过接口(interface)继承发现 VBA 中多态的可能性,这与类继承不同。

    有了类继承,你就可以拥有 virtual甚至 abstract方法 override在派生类中。

    使用 .NET 风格的接口(interface)继承,您可以拥有一个扩展另一个接口(interface)的接口(interface),并且实现类型可以只实现该接口(interface)以满足编译器 - 它公开它所扩展的所有接口(interface)的成员。

    使用 VBA 风格的接口(interface)继承,您将获得一个可以实现接口(interface)的类。或者两个。或三个。或者更多。 ... COM 类型的方式。

    这已经……非常棒了。

    它被称为面向对象编程——OOP 有 4 点:
  • 抽象
  • 封装
  • 继承(悲伤的 VBA)
  • 多态性

  • 它是很多编程语言(例如 Java 和 C#)中的流行范例。理想的 OOP 代码是 SOLID、松散耦合的代码,可以轻松进行单元测试。 SOLID 原则指导了很多 OOP 设计:
  • [S]单一责任原则
  • 【开放/封闭原则】
  • [L]iskov替换原理
  • [I]接口(interface)隔离原理
  • [D]依赖倒置原理

  • 尽管缺乏继承能力,VBA 仍然可以尊重这些 OOP 原则,同时拥抱其无构造函数的 COM 性质。 Extensible Logging关于代码审查,以及实现 DatabaseLogger 的后续帖子,对它做一个非常强大的演示。

    但即使不使用接口(interface),在 OOP 中思考也可以封装任何功能,并以可重用组件的方式编写它。像这样 reusable progress indicator这说明了如何从运行显示的 UI(用户窗体或工作表)代码隐藏到让 UI 成为应用程序逻辑中的 I/O 设备。

    通过使用 VBA 学习 OOP,您正在塑造您的思维过程,并开始从过程范式到面向对象代码的奇迹之旅。一旦你掌握了这一点,你就会想要将你的经验扩展到成熟的类继承,并发现委托(delegate)和匿名函数,甚至可能研究函数式编程范式,这是另一种完全不同的思考方式代码,就像 OOP 是程序化的一样。

    不幸的是,VBA IDE,光荣的 VBE,最后一次更新是在 VB6 风靡一时,并且没有太多 OOP 鼓励功能。甚至可以说 VBE 非常讨厌 OOP:
  • Project Explorer 的唯一文件夹是模块类型,因此具有许多类的项目很快就会变成导航噩梦。
  • 没有“转到实现”功能可以轻松定位接口(interface)的实现。
  • 没有重构工具。
  • 没有单元测试。
  • 没有静态代码分析。

  • 公平地说,单元测试和重构工具在 1999 年并没有像今天这样普遍(AFAIK)。尽管如此,VBA 中 OOP 的缺点是 IDE 本身缺乏功能。

    幸运的是,VBIDE 具有可扩展性模型并支持加载项。所以你可以得到 Rubberduck并拥有所有这些功能并在 VBA 中编写 OOP 代码,而不必经常因缺乏 IDE 功能而烦恼。

    DISCLAIMER: I manage the Rubberduck open-source project, hosted on GitHub.

    关于VBA继承模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46375031/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com