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

时间:2016-10-22 19:26:46

标签: vba class overloading

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

我想编写类Vc,使其属性可以是可选的(以适应上述两种定义方法)并自动执行“填充缺少的可选项”所需的计算 data“:即用户是否写入xA,yA,xB,yB属性 缺失的属性Len和Angle由代码自动计算, 反之亦然。

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

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

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

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

我希望我可以在属性中解决这个问题 本课程的一部分,不需要写很多东西 引入重复定义的方法, 我很害怕。

1 个答案:

答案 0 :(得分:0)

在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

但是我相信如果你以一种只返回存储值并且不依赖于彼此的方式定义类属性会更好,并且在模块中创建几个构造函数来接受你的不同参数集并初始化该类的所有字段都正确,就好像所有属性都已提供一样。