2010-09-08 74 views
11

模擬例如,我有一個實現B類VBA繼承,超

---類A類----

implements B 
public sub B_do() 
end sub 

--class乙----

public sub do() 
end sub 

如何從A調用do()? (super.do())那麼,我如何爲兩個類定義一些公共變量?現在,我可以只繼承功能,子和屬性...

補充說:同樣的問題http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/5a83d794-3da1-466a-83d3-5d2eb0a054b2

補充說:這是不可能的跨類hierarhy共享變量。你應該實現屬性(和函數一樣)。

回答

19

的常用方法在VBA做到這一點是有一個包含B的一個實例,以及具有A實現B的接口,然後委託調用A的B界面到內部B.

這是舊的東西,但看到的Visual Studio 6.0程序員指南:

http://msdn.microsoft.com/en-us/library/aa716285(VS.60).aspx

上有一章「許多(國際米蘭)代碼重用的面孔」描述此約定:

http://msdn.microsoft.com/en-us/library/aa240846(v=VS.60).aspx

MS描述它的方式是:

除了實現抽象 接口,可以通過 重用代碼實現的 普通類的接口,然後選擇 委託給隱藏 類的實例。

這意味着實現繼承需要大量的顯式委託方法。甚至有一章的副標題:「這不是很乏味?」。另一個原因OOP在VBA是一個PITA(TM)...

編輯,將不適合在註釋:

爲您解答您的評論中提出的問題,那麼,一個A a B.當你製作一個B實現的接口時,你基本上說你可以把A的一個實例看作是實際上是B的類型。在VBA中,你的做法是聲明一個B類型的變量,然後將其設置爲A.當您將它稱爲B時,VBA將知道該做什麼:

Dim usedAsB as B 
Dim anA as A 

Set anA = New A 
Set usedAsB = anA 'fine since A implements B 

usedAsB.something() 'will call B_something() defined in class A 

至於您在deb中看到的內容ug窗口,我不這樣看。至於強制授權,我不確定你的意思。 VBA自動將調用B接口調度到A類中的正確方法。如果你的意思是自動生成代碼以上述方式繼承B的實現,那麼就沒有我所知道的VBA。我認爲VB6的各種「專業」版本可以做到這一點,但我從來沒有使用VB6,所以我不知道。

+0

謝謝!你知道一些關於VBA中類精確實例的資料嗎?在調試中,我看到A類有一個B類型的字段。因此,在互聯網的某個地方,我發現A類型的對象實際上是B(!)類型的對象。強制授權。 – nikaan 2010-09-08 21:49:49

+0

@Nikita,我會閱讀「程序員指南」中處理「用對象編程」的其他章節。至於另一個問題,我將編輯我的答案,因爲它可能不適合評論。所以幾分鐘後再看 – jtolle 2010-09-08 23:01:51