Wie generiere ich T auf ein TObject?

8

Ich habe eine Methode, die ein Objekt zurückgeben muss. Natürlich macht es nur Sinn, wenn das T ein Objekt ist:

%Vor%

Wenn T kein Objekt ist (z. B. Integer , String oder OleVariant ), gibt es nil zurück und stürzt nicht schrecklich ab.

Wenn wir ein Objekt sind (z. B. TCustomer , TPatron , TSalesOrder , TShape ), können wir das Objekt einfach zurückgeben.

Ich wollte das Problem nicht verwirren; Aber wenn du IEnumerable betrachtest, wirst du sehen, was gerade passiert.

Bonuslesen

Antwort

Ich werde TLama die Antwort kopieren und einfügen lassen, um seine Anerkennung zu erhalten:

%Vor%     
Ian Boyd 04.02.2015, 01:32
quelle

2 Antworten

1

Ich sehe zwei Hauptoptionen. Wenn der generische Typ ein Klassentyp sein muss und dies zur Kompilierungszeit bekannt ist, sollten Sie eine Einschränkung auf den Typ anwenden:

%Vor%

Oder, wenn der Typ von einer bestimmten Klasse abgeleitet werden muss, kann diese Einschränkung wie folgt angegeben werden:

%Vor%

Sobald die Einschränkung angewendet wird, ist die direkte Zuweisung alles was Sie brauchen.

%Vor%

Dies wird möglich, weil der Compiler die Einschränkung für Ihren generischen Typ erzwingt. Und weiß, dass die Zuweisung für alle möglichen Instanziierungen gültig ist.

Ich würde bemerken, dass es seltsam erscheint, dass eine generische Klasse eine Funktion hat, die TObject zurückgibt. Warum gibt Ihre Funktion T nicht zurück?

Wenn Sie nicht beschränken können, dann ist ein einfacher Pointer-Cast der sauberste Ansatz:

%Vor%

Offensichtlich müssen Sie überprüfen, ob T ein Klassentyp ist, Code, für den Sie bereits Mastery demonstriert haben.

Für was es sich lohnt, seit Delphi XE7 ist es einfacher, die Art eines Typs mit System.GetTypeKind zu überprüfen:

%Vor%     
David Heffernan 04.02.2015, 08:41
quelle
0

Ja, es kann über TValue gemacht werden, aber es ist nicht der richtige Weg. Ich glaube, es ist viel besser, wenn der Compiler überprüft, ob es ein TObject (oder ein Nachkomme) ist.

%Vor%

Dann können Sie es testen:

%Vor%

    
Jens Borrisholt 04.02.2015 07:03
quelle

Tags und Links