由于 VBA 中的新项目,我从 VB.NET 迁移,老实说,我真的不知道如何处理这里的对象类。我想要达到的是比较不同类对象模块之间的对象。
例如
class Employee
属性:Name
,Age
点是:比较Name
两个Employees之间的s
类:员工和经理
点是:Name
从员工与经理Name
比较
我知道如何在 VB.NET 中使用,但是如何比较 VBA 中不同类模块对象的属性?
由于 VBA 中的新项目,我从 VB.NET 迁移,老实说,我真的不知道如何处理这里的对象类。我想要达到的是比较不同类对象模块之间的对象。
例如
class Employee
属性:Name
,Age
点是:比较Name
两个Employees之间的s
类:员工和经理
点是:Name
从员工与经理Name
比较
我知道如何在 VB.NET 中使用,但是如何比较 VBA 中不同类模块对象的属性?
VBA 不支持类多态,所以我建议改变你对Employee
andManager
类的思考方式。
您不能将一个Employee
类作为基类,然后将一个单独的Manager
类从. Employee
它们可以是实现公共接口的2 个单独的类。
我稍后会详细讨论它。现在让我们来看几个例子......
base
类 ( Person
) 和从基类派生的子类。(适用于 C#、VB.NET 等)
但在 VBA 中你必须这样想:
公开描述位置的枚举属性的基类。
就像是
这是让类公开一些属性的最简单方法。它允许您将对象添加到集合中并使用带有IntellisensePerson
的简单循环进行迭代!for each
属性比较系统将非常容易
注意:同样适用于枚举,因为它隐式转换为数字
两个单独的类都公开公共属性。例如,您有一个Employee
和Manager
类,它们都实现了一个Person
接口Comparer
和一个公开Compare()
方法的附加类
在您的 VBA 项目中,您需要 4 个类模块和一个标准模块
Person
(这是你的界面)
Public Property Get Name() As String
End Property
Public Property Get Age() As Long
End Property
此类是两者都需要实现以共享一些通用功能(名称和年龄的getter)的Employee
接口Manager
。拥有接口允许您使用接口类型变量作为枚举器执行 for each 循环。你会在一分钟内看到。
Employee
并且Manager
是相同的。显然,您可以修改它们以适合您的实际解决方案。
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()
中查看结果
上述代码最好的部分是您正在创建Person
接口的引用变量。它允许您遍历集合中实现该接口的所有项目。此外,如果您有更多的属性和功能,您可以使用非常棒的 Intellisense。
比较
再看一下ComparerCls
类中的代码
我希望你现在明白为什么我把它分成一个类。它的目的只是照顾对象被比较的方式。您可以指定枚举顺序并修改Compare()
方法本身以进行不同的比较。请注意 Optional 参数,它允许您在没有比较方法的情况下调用 Compare 方法。
现在您可以尝试将不同的参数传递给比较函数。看看结果如何。
尝试组合:
emp.Name = "name"
man.Name = "name"
Comparer.Compare(emp, name, Names)
Comparer.Compare(emp, name, References)
Comparer.Compare(emp, emp, References)
如果仍有不清楚的地方,请参阅这个关于Implements
VBA 中关键字的答案