两个 VBA Class 属性可以互相写入来模拟重载吗?

Can two VBA Class properties write to each other to simulate overloading?

假设我有一个名为 Vc 的 class,它代表一个几何向量 AB。 我们可以通过两个点 (xA, yA, xB, yB) 或一个点、一个距离和一个角度 (xA, yA, Len, Angle) 来定义向量。

我想编写 class Vc 使其属性既可以是可选的(以适应上述两种定义方法)又可以自动执行“填充”所需的计算缺少可选的 data”:也就是说,如果用户写入属性 xA、yA、xB、yB,则 缺少的属性 Len 和 Angle 由代码自动计算, 反之亦然。

现在简单的编码,我将处理一个类似的问题而不是 几何问题:

假设我有两个数字 NbA 和 NbB,其中 NbA = 2 NbB,用户可以输入 NbA 或 NbB,

我试过这段代码,希望NbA至少能计算出NbB (或由用户输入)

Private pNbA As Double
Private pNbB As Double

Public Property Get NbA() As Double
 NbA = pNbA
End Property

Public Property Let NbA(value As Double)
 pNbA = value
End Property

Public Property Get NbB() As Double
 NbB = pNbB
End Property

Public Property Let NbB(NbA As Double)
 pNbB = NbA * 2
End Property

但是在测试时我得到 NbB = 0(而 nbA=1):

Sub TestAbove()
 Dim aTest As TestClass
 Set aTest = New TestClass
 aTest.nbA = 1
 MsgBox aTest.nbB 'this gives 0
End Sub

我希望我能在属性中解决这个问题 class 的一部分,而无需写很多 会引入重复定义的方法, 我害怕。

在 VB.NET 中,您将使用 Nullable(Of Double)
在 VBA 中,出于相同的目的,您可以使用 Variant/Empty:

Private pNbA As Variant  ' Empty by default

Public Property Get NbA() As Double
  if IsEmpty(pNbA) then NbA = 2 * NbB else NbA = pNbA
End Property

Public Property Let NbA(value As Double)
  pNbA = value
End Property

但是我相信如果您定义 class 属性时它们只 return 存储值并且不相互依赖,并且在一个模块中创建多个构造函数会更好这将接受您的不同参数集并正确初始化 class 的所有字段,就好像提供了所有属性一样。