2016-06-09 9 views
3

Ich habe eine generische Sammlung wie folgt aus:Wie erweitere ich eine generische Sammlung in Delphi?

TFoo = class; 

TFooCollection<T: TFoo> = class(TObjectDictionary<string, T>) 
    procedure DoSomething; 
end; 

Es funktioniert gut.

Jetzt brauche ich TFooCollection wie folgt zu erweitern:

TBar = class(TFoo); 

TBarCollection<T: TBar> = class(TFooCollection) 
    procedure DoSomethingElse; 
end; 

Und der Compiler beschwert sich, dass TFooCollection nicht definiert ist. Da TBar von TFoo erbt, möchte ich die TFooCollection-Methoden (die mit TFoo und TBar-Elementen funktionieren würden) nutzen und etwas anderes nur mit TBar Collections tun.

Ist es in Delphi möglich?

+1

Als eine breite Regel bevorzugen Verkapselung zu Vererbung. Möchtest du wirklich, dass jede Methode der Sammelklasse von deiner Klasse offengelegt wird? –

+0

@david Es ist nur so, dass ich in der Basisklassen-Sammlung eine Logik bezüglich Speichern/Laden habe. Der Vererbungsbaum ist nicht tief (nur eine Ebene), aber er ist sehr breit, da wir viele Sammlungen mit verschiedenen Objektklassen haben. – MarcosCunhaLima

Antwort

4

Sie wussten, wie Sie die generische Sammlung erweitern können TObjectDictionary, wenden Sie einfach die gleiche Technik an, wenn Sie die generische Sammlung TFooCollection erweitern. TObjectDictionary gibt keinen Typ selbst an - Sie mussten Werte für die beiden generischen Typparameter angeben. Eine, die Sie fest auf string codiert haben, und die andere, die Sie durch Weiterleiten des generischen Typparameters erhalten haben, der in TFooCollection empfangen wird.

Ebenso wird, wenn der Basistyp für TBarCollection angeben, können Sie entweder eine hartcodierte Wert für den TFooCollection Typparameter oder der Parameter von TBarCollection weiterleiten kann. Wahrscheinlich möchten Sie Letzteres tun:

type 
    TBarCollection<T: TBar> = class(TFooCollection<T>) 
    end; 
+0

Es ist genau das, was ich will! Vielen Dank – MarcosCunhaLima

0

Denken Sie daran, dass die Typdeklarationen in generischen Klassen Teil des Typnamens sind. Der Compiler ist ziemlich korrekt besagt, dass Sie keinen TFooCollection-Typ definiert haben. Sie haben einen Typ namens TFooCollection (oder TFooCollection) definiert.

Verwandte Themen