VBA是一种OOP语言吗?它支持多态吗?

我正在做我的第一个VBA项目。 (来自C ++

我想通过实现类和多态来改进现有的Microsoft Excel工作簿使用的VBA项目。

我的问题是:

1 –我读了很多文章/论坛,解释说VBA不是面向对象编程( OOP )语言,不支持多态。

其中一些人提出了使用关键字实现的解决方法。

2 –我还发现了一些这样的网页,它解释了如何在VBA中使用关键字(如InheritsOverrideOverridableMustOverrides)执行OOP和多态。

所以我的问题是:

VBA是一种OOP语言吗?它支持多态吗?

OOP坐在4个“支柱”上:

  • 查 抽象 – 抽象逻辑和概念可以通过在类模块中定义对象来轻松完成。 严格地说,通过使用有意义的标识符并将过程代码提取到方法(类成员)中也可以实现抽象

  • 查 封装 – 类可以有属性暴露的私有领域; 类可以做成PublicNotCreatable ,有效地将types暴露给其他的VBA项目 – 只需要一点点的努力(通过导出类模块,在你喜欢的文本编辑器中打开它,手动编辑类属性,并重新导入模块),你可以实现实际不可变的types。 没有参数化构造函数的事实是无关紧要的 – 只需编写一个工厂方法,它接受所有你喜欢的参数并返回一个实例。 这是COM,COM也喜欢工厂。

  • 查 多态Implements允许你实现抽象接口(和具体的类),然后你可以编写一个代码来抵抗一个可以成为Foo或者Bar抽象(既然FooBar都实现了ISomething )代码有史以来需要看到的是东西。 方法重载是VBA所缺乏的一种语言function,但重载与多态无关,也就是为不同的底层表单(数据types)提供相同接口的能力

  • 不 inheritance – VBA不允许从另一个派生types:不支持inheritance。

现在的问题是, 不支持inheritance的语言是否可以称为“面向对象”? 事实certificate, 组合通常更适合于inheritance,这有一些注意事项。 而VBA则会让你将心灵的内容组合起来。

VBA是一种OOP语言吗?

鉴于所缺less的是遗传,而且这种构图比inheritance更好,我很想回答“是”。 我之前写过全面的OOP VBA代码(Model-View-Presenter with Unit-of-Work和Repository,任何人?),我不会用支持inheritance的“真正的OOP”语言写任何不同的东西。

这里有几个例子,所有100%的VBA:

  • 可重复使用的进度指示器
  • 模型 – 视图 – 演示者模式
  • UnitOfWork与存储库模式
  • 多态logging器
  • Automagicunit testing框架

最后一个链接中的代码最终移植到了C#,并迅速演变为VBA IDE的COM插件 ,为您提供重构,更好的导航,代码检查和IDE集成的Git源代码控制。

VBA只是你所做的限制。

简短的答案是否定的。

VBA是基于对象的,允许您定义类和创build对象的实例,但是它缺less通常与完全成熟的OOP语言相关的function,例如:

  • 封装和抽象:VBA在一定程度上提供了这个function。 类可以保持私有的公共接口定义,但是没有规定类中的构造函数。 类有一个Class_Inititalize事件可以做一些build设,但不能拿参数。 传递参数需要一个公共工厂函数的解决方法,仍然需要创build一个构造器样式的devise模式。
  • inheritance:在VBA中确实不存在,但几乎可以复制
  • 多态性:尽pipe不存在重载函数的能力(例如),但是每个“重载”在技术上都需要唯一的函数名称,但可以通过接口(使用Implements )在一定程度上Implements 。 您可以通过传递一个对象作为函数或子的唯一参数并根据属性的值改变过程。

因此,尽pipe您可以在一定程度上处理对象,而MS Office应用程序基于对象模型,但VBA并不是真正的面向对象的语言。 多态性无法达到您在C ++中熟悉的程度。