如何使用类似于VB.NET的方式在VBA中使用类对象模块之间的比较方法?

由于VBA中的新项目,我从VB.NET中移出,说实话,并不真正知道如何在这里处理对象类。 我想要达到的是比较不同的类对象模块之间的对象。

例如

class级员工
属性: NameAge
要点是:比较两个员工之间的Name

类: 员工经理
要点是:比较员工 Name经理 Name

我知道如何在VB.NET中,但如何比较VBA中不同类模块对象的属性?

VBA不支持类多态,所以我build议改变你对EmployeeManager类的思考方式。

您不能将Employee类作为基类 ,然后再从Employee 派生出单独的Manager类。 他们可以是2个独立的类实现一个通用的接口。

我会详细的谈一下。 现在我们来看几个例子


↓容易的方法↓


base类( Person )和派生自基类的子类。 适用于C#,VB.NET等

但在VBA中你必须这样想:

公开一个描述位置的枚举属性的基类。

就像是

在这里输入图像描述

在这里输入图像描述

这是让一个类暴露一些属性的最简单的方法。 它允许您将Person对象添加到集合中,并使用Intellisense的 for each循环的易用代码for each迭代!

在这里输入图像描述

性能比较系统将非常容易

在这里输入图像描述

注意:同样适用于枚举,因为它隐式转换为数字


↓更复杂的方法↓


两个分开的类都暴露公共财产。 比如你有一个EmployeeManager类,它们都实现了一个Person接口和一个额外的Comparer类,暴露了一个Compare()方法

在这里输入图像描述

在您的VBA项目中,您需要4个课程模块和一个标准模块

在这里输入图像描述

Person (这是你的界面)

 Public Property Get Name() As String End Property Public Property Get Age() As Long End Property 

这个类是EmployeeManager都需要实现的接口,以共享一些常用的function(名字和年龄的获取者)。 使用接口可以使用接口typesvariables作为枚举器来为每个循环执行操作。 你会在一分钟内看到

EmployeeManager是相同的。 显然你可以修改它们以适合你的真实生活的解决scheme

 Implements Person Private name_ As String Private age_ As Long Public Property Get Name() As String Name = name_ End Property Public Property Let Name(ByVal Value As String) name_ = Value End Property Public Property Get Age() As Long Age = age_ End Property Public Property Let Age(ByVal Value As Long) age_ = Value End Property Private Property Get Person_Name() As String Person_Name = Name End Property Private Property Get Person_Age() As Long Person_Age = Age End Property 

ComparerCls 将使用此类的一个实例来比较两个对象的属性或引用 。 你不一定需要有一个类,但我更喜欢这种方式。

 Public Enum ComparisonMethod Names = 0 ' default Ages = 1 References = 2 End Enum ' makes names the default comparison method Public Function Compare(ByRef obj1 As Person, _ ByRef obj2 As Person, _ Optional method As ComparisonMethod = 0) _ As Boolean Select Case method Case Ages Compare = IIf(obj1.Age = obj2.Age, True, False) Case References Compare = IIf(obj1 Is obj2, True, False) Case Else Compare = IIf(obj1.Name = obj2.Name, True, False) End Select End Function 

和你的Module1代码

 Option Explicit Sub Main() Dim emp As New Employee emp.Name = "person" emp.Age = 25 Dim man As New Manager man.Name = "manager" man.Age = 25 Dim People As New Collection People.Add emp People.Add man Dim individual As Person For Each individual In People Debug.Print TypeName(individual), individual.Name, individual.Age Next End Sub 

运行Main()子,并在即时窗口中查看结果

在这里输入图像描述

上面代码的最好的部分是你创buildPerson接口的引用variables。 它允许你循环实现接口的集合中的所有项目。 另外,如果你有更多的属性和function,你可以使用Intellisense。


对照


再看看ComparerCls类中的代码

在这里输入图像描述

我希望你现在看到为什么我把这个分成了一个class。 它的目的只是照顾对象的比较方式。 您可以指定枚举顺序并修改Compare()方法本身以进行不同的比较。 请注意可选参数,它允许您在不使用比较方法的情况下调用Compare方法。

在这里输入图像描述

现在你可以玩到不同的parameter passing给比较function。 看看结果是什么样的

尝试组合

 emp.Name = "name" man.Name = "name" Comparer.Compare(emp, name, Names) Comparer.Compare(emp, name, References) Comparer.Compare(emp, emp, References) 

如果还不清楚,请参考有关VBA中的Implements关键字的回答