AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Überladene, generische Methode aufrufen

Ein Thema von s.h.a.r.k · begonnen am 3. Dez 2010 · letzter Beitrag vom 4. Dez 2010
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Überladene, generische Methode aufrufen

  Alt 3. Dez 2010, 00:07
Delphi-Version: 2010
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:
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;
Ohne Generics funktioniert und compiliert das ganze wunderbar. Aber hier erscheint dann diese tolle Fehlermeldung:
Zitat:
[DCC Fehler] ApAnimations.pas(184): E2506 Im interface-Abschnitt deklarierte Methode des parametrisierten Typs darf kein lokales Symbol ':6' verwenden
Gerate wurde ich sagen, dass ich das nicht machen darf, da der Compiler einfach nicht damit klar kommt. Kennt hierfür aber evtl. jemand eine Lösung bzw. Workaround?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Überladene, generische Methode aufrufen

  Alt 3. Dez 2010, 00:44
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 Animator.Add<irgendwas>(...); 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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Überladene, generische Methode aufrufen

  Alt 3. Dez 2010, 00:46
Das heißt quasi, ich darf das nicht machen?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Überladene, generische Methode aufrufen

  Alt 3. Dez 2010, 01:02
theoretisch dürftest du es machen ... wenn Emba es mal hinbekommt den "eigentlich" externen Typen T an dieser Stelle auch als extern anzusehn
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Überladene, generische Methode aufrufen

  Alt 3. Dez 2010, 01:05
Ach ja... die liebe Theorie Naja, dann muss ich halt mal doch ein wenig doppelten Code schreiben... Danke für die Info!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
USchuster

Registriert seit: 12. Sep 2010
Ort: L.E.
120 Beiträge
 
Delphi XE3 Professional
 
#6

AW: Überladene, generische Methode aufrufen

  Alt 3. Dez 2010, 21:41
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Überladene, generische Methode aufrufen

  Alt 3. Dez 2010, 22:18
Schade daß ich mir dieses XE genannte Update nicht leisten kann.
Vorallem die vielen "Internal Error" kenn ich schon zu Genüge.
$2B or not $2B

Geändert von himitsu ( 3. Dez 2010 um 22:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

AW: Überladene, generische Methode aufrufen

  Alt 4. Dez 2010, 00:48
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Überladene, generische Methode aufrufen

  Alt 4. Dez 2010, 00:59
[OT]
sorry für OT, aber komplexe Systeme, komplexe Fehler ...
[/OT]
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#10

AW: Überladene, generische Methode aufrufen

  Alt 4. Dez 2010, 01:03
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz