gpt4 book ai didi

oop - 有没有办法为具有私有(private)成员的 VBA 类编写相等性测试,而不暴露这些私有(private)成员存在的知识?

转载 作者:行者123 更新时间:2023-12-04 19:20:07 25 4
gpt4 key购买 nike

我做了相当多的 Excel VBA 编程,但不是很多都是面向对象的。这里时不时出现一些让我烦恼的东西,我想知道我是否遗漏了一些东西。

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

'...

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 中编译,因为类成员函数只能访问调用它们的同一实例的私有(private)类成员。我曾经想出的最好的方法是定义两个成员函数,如下所示:
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

它很麻烦,并且暴露了私有(private)类成员存在的知识,但至少它避免了实际暴露私有(private)类成员的值。

这是我能做的最好的吗?

编辑:

像往常一样,在回答之后,我意识到了一种更好的方式来表达这个问题。它的标题是“是否有一种更简洁的方法可以为具有私有(private)成员的 VBA 类编写相等测试?”当迪克回答时。

最佳答案

我会这样写类(class)

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,但不能 Let)。然后你可以在类中创建 IsEquivalent bool 属性。

关于oop - 有没有办法为具有私有(private)成员的 VBA 类编写相等性测试,而不暴露这些私有(private)成员存在的知识?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4487521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com