2010-09-08 6 views
11

Na przykład mam klasy A, który implementuje klasa BVBA spadku analog super

--- klasy A ----

implements B 
public sub B_do() 
end sub 

--class B ----

public sub do() 
end sub 

Jak mogę zadzwonić do() z A? (super.do()) Jak zdefiniować wspólną zmienną dla obu klas? Teraz mogę dziedziczyć tylko funkcje, SUB i właściwości ...

dodał: To samo pytanie http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/5a83d794-3da1-466a-83d3-5d2eb0a054b2

dodał: To nie jest możliwe, aby podzielić się zmienną całej hierarhy klas. Powinieneś zaimplementować właściwość (tak samo jak funkcje).

Odpowiedz

19

sposobem by zrobić w VBA mieć zawierać wystąpienie B, jak również o realizować interfejs B, a następnie przekazanie połączenia do interfejsu komunikatów B od A do wewnętrznej B.

ten jest stare rzeczy, ale zobacz Visual Studio 6.0 programisty przewodnik:

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

jest rozdział o "wielu (Inter) Faces of Code ponowne wykorzystanie", która opisuje tę konwencję:

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

Sposób MS opisuje to jest:

Oprócz realizacji abstrakcyjnych interfejsy, można ponownie użyć kodu przez wdrażaniu interfejs z zwykłej klasie, a następnie selektywnie delegowanie do ukryty wystąpienie klasy .

Oznacza to, że dziedziczenie wdrażania wymaga wielu jawnych metod delegowania. Podtytuł nawet rozdział: "Czy to nie jest nudne?". Jeszcze inny powód, dla którego OOP w VBA jest PITA (TM) ...

EDIT, które nie mieszczą się w komentarzu:

odpowiedzieć na pytanie postawione pan w komentarzu, dobrze, jest typu A a B. Kiedy tworzysz interfejs A narzędzia B, zasadniczo mówisz, że możesz traktować instancję A tak, jakby faktycznie była ona typu B. W języku VBA, tak jak to robisz, deklarując zmienną typu B, a następnie ustawienie go na wystąpienie A. VBA będzie wiedział, co zrobić, gdy nazywają go jak B:

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 

jeśli chodzi o to, co widzisz w deb ug okno, nie wiem dlaczego tak się wydaje. A jeśli chodzi o wymuszoną delegację, nie jestem pewien, co masz na myśli. VBA automatycznie wywołuje połączenia do interfejsu B z odpowiednimi metodami w klasie A. Jeśli masz na myśli automatyczne generowanie kodu do dziedziczenia implementacji B w sposób opisany powyżej, nie ma nic takiego, o czym wiem dla VBA. Myślę, że różne "profesjonalne" wersje VB6 mogłyby to zrobić, ale nigdy nie korzystałem z VB6, więc nie wiem.

+0

Dzięki! Czy znasz jakieś źródło o precyzyjnym instancji klas w VBA?W debugowaniu widzę, że klasa A ma pole typu B. Tak więc, gdzieś w Internecie uważam, że obiekt typu A jest obiektem typu B (!), Rzeczywiście; z wymuszoną delegacją. – nikaan

+0

@Nikita, przeczytałbym inne rozdziały w Przewodniku programisty, który zajmuje się "programowaniem z obiektami". Jeśli chodzi o inne pytanie, zamierzam edytować moją odpowiedź, ponieważ prawdopodobnie nie zmieści się w komentarzu. Spójrz tam za kilka minut ... – jtolle