2016-07-05 10 views
2

Ich versuche, einen Baum (Art eines zusammengesetzten Musters tatsächlich) zu erstellen, aber ich kann einfach nicht die erstellten Elemente einer Klasse zu einer Sammlung von Elementen hinzufügen Elternteil.VBA: Hinzufügen von Klassenelementen zu einer Sammlung innerhalb der Klasse

Innerhalb der Klasse

Private pChildList As Collection 

Private Sub Class_Initialize() 
    Set pChildList = New Collection 
End Sub 

Public Property Set ChildList(Value As CProduct) 
    pChildList.Add Value 
End Property 

Public Property Get ChildList() As Collection 
    ChildList = pChildList 
End Property 

Die Hauptfunktion

Set Pro = New CProduct 
Set Child = New CProduct 
Pro.ChildList.Add Child 

So das Ergebnis Aufruf sollte in seiner pChildList Sammlung ein Elternteil (Pro) mit einem Kind sein, aber ich habe nur den Fehler, "Argument ist nicht optional".

Vielen Dank im Voraus!

Antwort

4

Sie vermissen nur eine Set in Ihrer Eigenschaft Get definition. Ein Collection ist ein Objekt, Sie müssen das Schlüsselwort Set verwenden, um es auf eine Variable zu beeinflussen.

Public Property Get ChildList() As Collection 
    Set ChildList = pChildList 
End Property 

meine Antwort ergänzen folgende Sie Kommentar:

Property Set sind für Objekte, Property Let sind für Basistypen. Diese beiden Eigenschaften werden normalerweise verwendet, um den Wert einer Membervariable zu ändern (und werden dies voraussichtlich tun), dh um auf die Variable für das Schreiben zuzugreifen, aber Sie können im Code tun, was Sie wollen. Property Get werden normalerweise verwendet, um den Wert einer Membervariable zurückzugeben (aber Sie können wieder tun, was Sie wollen, in Code), dh auf die Variable zum Lesen zugreifen. Da es keinen Grund gibt, die pChildList selbst zu ändern, würde ich die Property Set komplett fallen lassen. Sie können auch entscheiden, vollständig die Membervariable zu verstecken und Member-Funktionen verwenden, um Childs hinzuzufügen und zu entfernen, zum Beispiel:

Public Sub AddChild(vValue as CProduct) 
    pChildList.Add vValue 
End Sub 
+0

Wow, vielen Dank! Was ich jetzt noch nicht bekomme, wenn ich den Code durchtrete, ist warum er die "Get" -Funktion trotzdem benutzt? Ich versuche, ein Element zu pChildList zu setzen (oder tatsächlich hinzuzufügen), muss das Programm zuerst die Sammlung an die Hauptfunktion zurückgeben und das Element dort hinzufügen, bevor die neue Sammlung an die Klasse zurückgegeben wird oder was ist das? – user2950764

+1

Nun, der Code tut, was Sie sagen, wenn Sie 'Pro.ChildList.Add Child' geschrieben haben. Du hättest auch 'Set Pro.ChildList = Child 'schreiben können, um das Gleiche zu tun (angesichts des Codes, den du geschrieben hast, beachte, dass die' Set'-Eigenschaft, die du geschrieben hast, ungerade ist und nicht das tut, was erwartet werden könnte). –

+0

Wenn ich ehrlich bin, habe ich nur die Set-Funktion gemacht, weil "Let", das ich für die anderen Variablen verwende, mir einen Fehler gab, es hieß nur "get, let or set" und set habe mir keinen Fehler gegeben . Was wäre also der bevorzugte Weg, pChildList außerhalb der Klasse zurückzugeben/darauf zuzugreifen? – user2950764