vb6 entspricht listsomeclass

8

Ich möchte wissen, ob ein Äquivalent von (.net) existiert

%Vor%

in vb6

Ich weiß, dass die Sammlung in vb6 existiert, aber sie verwendet Objekt (Variante) anstelle eines bestimmten Objekts.

danke.

    
magallanes 14.11.2010, 13:40
quelle

4 Antworten

21

Es gibt keine direkte Entsprechung in VB 6 zu dem in VB.NET gefundenen generischen List<T> . In VB 6 gibt es jedoch eine Collection , die ähnliche Funktionalität bietet. Der Hauptunterschied besteht darin, dass ein VB 6 Collection nicht stark typisiert ist, was bedeutet, dass alle Objekte als Variants in der Sammlung gespeichert werden. In einigen Fällen kann dies von Vorteil sein, da Sie damit viele verschiedene Datentypen in derselben Sammlung speichern können. VB verwendet dieses Objekt intern. Es ist einfach genug, ein Collection und up-cast-Objekte zu verwenden, wenn sie aus der Klasse abgerufen werden, aber es gibt wenig, was Sie tun können. Es ist nicht möglich, in der VB-Laufzeit stark typisierte Auflistungen zu implementieren.

Es gibt einen Workaround, den Sie implementieren können. Ähnlich wie Collections in frühen Versionen von VB.NET implementiert wurden, bevor Generics eingeführt wurden, können Sie das Collection in eine Klasse einfügen, in der der einzige Zugriff auf das interne Collection über Methoden erfolgt, die Sie hier bereitstellen Klasse . Dieses Entwurfsmuster wird üblicherweise als "benutzerdefinierte Sammlung" bezeichnet.

Dies hat den Vorteil, dass das Casting automatisch gehandhabt wird, und die Benutzer Ihres Codes müssen sich nicht mehr Gedanken darüber machen, wie diese Implementierungsdetails aussehen. Es kümmert sich um die (allzu wahrscheinliche) Möglichkeit, dass Sie zur Laufzeit eine Sammlung durchforsten, die nur einen Objekttyp enthalten soll, aber versehentlich einen zweiten, inkompatiblen Objekttyp hinzugefügt hat, der Ihren Code verursacht eine Ausnahme auslösen Der Nachteil ist natürlich, dass Sie die meisten Funktionen, die bereits vom Objekt Collection bereitgestellt werden, in Form von öffentlichen Methoden für Ihre benutzerdefinierte Sammlung erneut implementieren müssen.

Hier ist ein Beispiel, wie Sie das machen könnten:

%Vor%

Beachten Sie, dass Sie zum Festlegen der Item -Eigenschaft der benutzerdefinierten Sammlung als Standardmethode der Sammlung (wie das integrierte Collection -Objekt) die folgenden Schritte in der VB 6-IDE ausführen müssen:

  1. Klicken Sie im Menü "Extras" auf "Prozedurattribute"

  2. Wählen Sie den Namen Ihrer benutzerdefinierten Klasse aus dem Kombinationsfeld "Name".

  3. Wenn das Dialogfeld angezeigt wird, klicken Sie auf die Schaltfläche "Erweitert".

  4. Wählen Sie im Kombinationsfeld "Prozedur-ID" den Eintrag "(Standard)".

  5. Klicken Sie auf "OK"


Wenn Sie auch die Aufzählung Ihrer benutzerdefinierten Klasse mit der For Each -Syntax zulassen möchten (wie das integrierte Collection -Objekt), können Sie Ihrer benutzerdefinierten Klasse eine NewEnum -Funktion hinzufügen:

%Vor%

Sobald Sie das getan haben, müssen Sie VB anweisen, diese Eigenschaft zu verwenden:

  1. Öffnen Sie wie zuvor den Dialog "Prozedurattribute" aus dem Menü "Extras"

  2. Wählen Sie den Namen Ihrer benutzerdefinierten Klasse aus dem Kombinationsfeld "Name".

  3. Wenn das Dialogfeld angezeigt wird, klicken Sie auf die Schaltfläche "Erweitert".

  4. Geben Sie im Kombinationsfeld "Prozedur-ID" die Zahl "-4" ein.

  5. Klicken Sie auf "OK"

Cody Gray 14.11.2010, 14:27
quelle
4

Hier ist unsere Implementierung von ArrayList. Sie können es als Basis (nicht durch Vererbung natürlich, aber durch Komposition wie in CodyGray's Antwort ausgedrückt) für eine stark typisierte Klasse verwenden, aber wenn Sie keine Typsicherheit benötigen, ist es viel besser als die Collection-Klasse.

%Vor%     
Kris Erickson 15.11.2010 16:38
quelle
2

BEARBEITEN: Wenn die Lösung von Cody Gray zu groß für Ihre Bedürfnisse ist, können Sie stattdessen die Lösung des "armen Mannes" wie folgt versuchen:

%Vor%

Natürlich ist ein List<somefixedclass> (in C #) oder ein List(Of somefixedclass) in VB.NET viel "benutzerfreundlicher", weil es Methoden wie Suchen, Entfernen, AddRange und einige andere hilfreiche Dinge hat. Das alte VB6-Konstrukt geht sehr schlecht mit dem Fall "leere Liste" um. Nicht zu vergessen, List & lt; .. & gt; Erhöhung hat eine viel bessere Leistung für große Listen (Größe & gt; 1000).

    
Doc Brown 14.11.2010 14:24
quelle
0

VB6 ist eine alte Sprache. Es enthält keine Template-ähnlichen Typen wie in modernen Sprachen (C ++, C #, Java). Sie müssen also Ihre Objekte als Varianten in der Sammlung speichern und sie später wieder auf Ihren Objekttyp zurückwerfen.

    
ThiefMaster 14.11.2010 13:45
quelle

Tags und Links