2016-10-22 48 views
0

假設我有一個名爲Vc的類,它表示一個幾何向量AB。我們可以通過兩個點(xA,yA,xB,yB)或點,距離和角度(xA,yA,Len,Angle)定義一個向量。兩個VBA類屬性可以相互寫入以模擬重載嗎?

我想編寫Vc類,使其屬性可以是可選的(以適應上述兩種定義方法),並自動執行「填充缺失的可選 數據」所需的計算:即if用戶寫入屬性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 

我希望我能在屬性中解決這個問題 部分的類本身,而不訴諸編寫的,將引入的定義重複, 恐怕方法很多 。

回答

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 

不過,我相信它會更好,如果你的方式,他們只返回存儲的值,並且不依賴於彼此定義的類屬性,在模塊中創建幾個構造函數,以接受不同的參數集,並正確初始化類的所有字段,就好像所有屬性都提供了一樣。

+0

如果爲NbB寫一個對稱部分,那麼在運行時我可以利用這個關係或者這個關係,但是不能同時使用這兩個關係......正如我現在嘗試的那樣。 –

+0

@ZiadElHachem如果這兩個值都是空的,那麼無論如何你都沒有任何東西可以返回。這就是爲什麼我建議你採用構造函數的方法,根據用戶輸入事先正確計算所有值。 – GSerg

+0

通過說'構造函數':你的意思是規則模塊中的常規函數​​,它可以計算NbA和NbB並提供給類,賴特? –