![]() |
Delphi-Version: 2010
Überladene, generische Methode aufrufen
Hallo zusammen,
ich schreibe mir gerade ein paar Klassen, mit denen ich so ziemlich alles animieren lassen will. Zunächst war meine Idee lediglich ein Overlay-Form einfaden zu lassen, allerdings ist mir das im Moment zu spezifisch. Bin im Moment dabei mich mal wieder mit Generics zu befassen und habe folgenden Code:
Delphi-Quellcode:
Ohne Generics funktioniert und compiliert das ganze wunderbar. Aber hier erscheint dann diese tolle Fehlermeldung:
procedure TAnimator.Add<T>(ATarget: TObject; APropertyName: String; AToValue: T);
begin Add<T>(ATarget, [APropertyName], [AToValue]); // Das hier ist Zeile 184 end; procedure TAnimator.Add<T>(ATarget: TObject; APropertyName: array of String; AToValue: array of T); begin // Do something... end; Zitat:
|
AW: Überladene, generische Methode aufrufen
Man darf allgemein innnerhalb von öffentlichen Generics nix verwenden, welches nicht öffentlich (lokal) ist.
Alles was du innerhalb des Generics nutzt, das muß auch öffentlich im Interface-Abschnitt deklariert sein. Also du darfst nix verwenden, welches erst im Implementation-Abschnitt zur Verfügung steht. Der Grund: Diese generische Methode wird erst da fertig eingebaut, wo sie verwendet wird. Wenn also in einer anderen Unit nun
Delphi-Quellcode:
aufgerufen wird, dann wird an dieser Stelle diese Funktion, mit diesem Typ erzeugt und von da aus muß nun auf alles genutzte Zugriff bestehn, welches bei lokalen/privaten Dingen nicht der Fall wäre.
Animator.Add<irgendwas>(...);
|
AW: Überladene, generische Methode aufrufen
Das heißt quasi, ich darf das nicht machen?
|
AW: Überladene, generische Methode aufrufen
theoretisch dürftest du es machen ... wenn Emba es mal hinbekommt den "eigentlich" externen Typen T an dieser Stelle auch als extern anzusehn :roll:
|
AW: Überladene, generische Methode aufrufen
Ach ja... die liebe Theorie :mrgreen: Naja, dann muss ich halt mal doch ein wenig doppelten Code schreiben... Danke für die Info!
|
AW: Überladene, generische Methode aufrufen
Schon mal mit XE getestet?
Mit folgendem Code bekomme ich mit XE keinen Fehler, aber mit 2010 schon. ([DCC Error] Unit20.pas(15): E2506 Method of parameterized type declared in interface section must not use local symbol ':3')
Delphi-Quellcode:
unit Unit20;
interface type TFoo = class procedure Add<T>(ATarget: TObject; APropertyName: String; AToValue: T); overload; procedure Add<T>(ATarget: TObject; APropertyName: array of String; AToValue: array of T); overload; end; implementation procedure TFoo.Add<T>(ATarget: TObject; APropertyName: String; AToValue: T); begin Add<T>(ATarget, [APropertyName], [AToValue]); // Das hier ist Zeile 184 end; procedure TFoo.Add<T>(ATarget: TObject; APropertyName: array of String; AToValue: array of T); begin // Do something... end; end. |
AW: Überladene, generische Methode aufrufen
Schade daß ich mir dieses XE genannte Update nicht leisten kann.
Vorallem die vielen "Internal Error" kenn ich schon zu Genüge. |
AW: Überladene, generische Methode aufrufen
Jo, das "Update"... XE und ich sind jedenfalls keine guten Freunde. Viele zu viele (neue) Fehler für zu wenig Neues. Aber herzlichen Dank für den Hinweis! Wenigstens da wurde was gemacht.
|
AW: Überladene, generische Methode aufrufen
[OT]
sorry für OT, aber komplexe Systeme, komplexe Fehler ... [/OT] |
AW: Überladene, generische Methode aufrufen
Aber warum baut man mit einer neuen Version der IDE mehr Fehler ein als in der davor? XE ist ja eigentlich echt nur ein Update, das muss Embarcadero schon zugeben (kein 64-bit Support, keine MacOS/Linux-Support). Aber ist halt immer so eine Sache ;) Es ist wie es ist und damit müssen wir wohl leben. Wollen wir einfach hoffen, dass die XE2 wieder taugt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz