oop – 有没有办法为私有成员编写VBA类的相等测试而不暴露这些私有成员存在的知识?

我做了大量的Excel VBA编程,但不是很多面向对象的.这是偶然出现的东西,这让我感到困扰,我想知道是否有一些我缺少的东西.

在VBA中,假设我有一个C类定义了一些私有成员,如下所示:

'...

Private hidden1_ As Double
Private hidden2_ As Double

'...

如果VBA像C或(大多数?)其他支持OOP的语言一样工作,我可以编写一个成员函数来在C类实例之间进行相似性测试,如下所示:

'Error: won't compile!
Public Function equal(cinst As C) As Boolean
    equal = (hidden1_ = cinst.hidden1_ And hidden2_ = cinst.hidden2_)
End Function

当然,这不会在VBA中编译,因为类成员函数只能访问它们被调用的同一实例的私有类成员.我做过这种事情的最好的方法是改为定义两个成员函数,如下所示:

Public Function equalDef(hidden1 As Double, hidden2 As Double) As Boolean
    equalDef = (hidden1_ = hidden1 And hidden2_ = hidden2)
End Function

Public Function equal(cinst As C) As Boolean
    equal = cinst.equalDef(hidden1_, hidden2_)
End Function

它很麻烦,它暴露了私有类成员存在的知识,但至少它避免实际暴露私有类成员的价值.

这是我能做的最好的吗?

编辑:

像往常一样,在回答之后,我意识到了一个更好的方式来表达这个问题.它的标题是“有没有更简洁的方法为私人成员的VBA类写一个平等测试?”当迪克回答时.

最佳答案
我会写这样的课

Private mdhidden1_ As Double
Private mdhidden2_ As Double

Public Property Get hidden1_() As Double

    hidden1_ = mdhidden1_

End Property

Public Property Get hidden2_() As Double

    hidden2_ = mdhidden2_

End Property

Private Sub Class_Initialize()

    'some method of setting variables private to the class
    mdhidden1_ = 1
    mdhidden2_ = 2

End Sub

Public Property Get IsEquivalent(clsCompare As C) As Boolean

    IsEquivalent = Me.hidden1_ = clsCompare.hidden1_ And Me.hidden2_ = clsCompare.hidden2_

End Property

如果您不得不公开该成员的知识,您也可以将其设为只读属性(Get,但不允许).然后,您可以在类中创建IsEquivalent boolean属性.

转载注明原文:oop – 有没有办法为私有成员编写VBA类的相等测试而不暴露这些私有成员存在的知识? - 代码日志