Ari*_*rie 24 vb.net comparison vba interface class
由于VBA中的新项目,我从VB.NET转移,说实话,不知道如何在这里处理对象类.我想要达到的是比较不同类对象模块之间的对象.
例如
class Employee
属性:Name,Age
point是:比较Name两个Employees之间的s
类:员工和经理
的观点是:比较Name从员工用Name的经理
我知道如何在VB.NET中,但如何比较VBA中不同类模块对象的属性?
小智 76
VBA不支持类多态,所以我建议改变你对类Employee和Manager类的思考方式.
你不能有一个Employee类的基类,然后一个单独的Manager那类派生的Employee.它们可以是两个实现通用接口的独立类.
我稍后会详细讨论它.我们现在来看几个例子......
base类(Person)类和子类,其从基类派生.(适用于C#,VB.NET等)
但在VBA中你必须这样想:
一个基类,它公开描述位置的枚举属性.
就像是


这是让类暴露某些属性的最简单方法.它允许您将Person对象添加到集合中,并使用Intellisense的easy 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
Run Code Online (Sandbox Code Playgroud)
这个类是其中两个接口Employee和Manager两个需要实现一些共同的功能(干将的姓名和年龄).使用接口允许您使用接口类型变量作为枚举器来执行每个循环.你会在一分钟内看到.
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
和你的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
Run Code Online (Sandbox Code Playgroud)
运行Main()sub并在立即窗口中检出结果

上述代码的最佳部分是您正在创建Person接口的引用变量.它允许您遍历实现该接口的集合中的所有项目.此外,如果你有更多的属性和功能,你可以使用Intellisense.
对照
再看看ComparerCls课堂上的代码

我希望你现在看到为什么我把它分开来成为一个班级.它的目的只是为了处理对象的比较方式.您可以指定Enum顺序并修改Compare()方法本身以进行不同的比较.请注意Optional参数,它允许您在没有比较方法的情况下调用Compare方法.

现在,您可以将不同的参数传递给比较功能.看看结果如何.
尝试组合:
emp.Name = "name"
man.Name = "name"
Comparer.Compare(emp, name, Names)
Comparer.Compare(emp, name, References)
Comparer.Compare(emp, emp, References)
Run Code Online (Sandbox Code Playgroud)
如果仍然不清楚,请参阅有关ImplementsVBA中关键字的答案
| 归档时间: |
|
| 查看次数: |
14721 次 |
| 最近记录: |