![]() |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Zitat:
Generics sind nun mal keine C++Templates. |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Type constraints kannst du in Delphi nur auf Interfaces oder Klassen angeben (glaub zusätzlich noch den "Muss constructor besitzen" Constraint, sonst fällt mir keiner ein) sonst nix. Das geht (wenn überhaupt, ich mach nicht viel damit) in .Net nur, weil alles ein object ist.
Mach entweder 2 oder mehrere Klassen aus dem Teil, welche ganz klar die Stringtypen abgrenzen oder schmeiß bestimmte davon ganz raus. Generics sind kein Werkzeug um mal eben zwei verschiedene Sachen (auch wenn sie ähnlich sind) in eins zu quetschen. @Andreas: Es könnte möglich sein, die Technik, die man schon vor den Generics für eine typensichere TObjektList nutzen konnte, auch dafür zu nutzen, das funktionierte auch über sowas wie nen Template, aber genau weiß ichs auch nicht. ( ![]() |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Nja, im Prinzip kann man nur Records und Objekte "verwenden",
wobei man innerhalb der generischen Klasse/Funktion nur mit Instanzen jonglieren kann, aber nicht mir Funktionen davon oder dessen Inhalt. Wenn der Delphicompiler aber den generischen Typ erst "auswerten" würde und vorher nur die Syntax prüfen täte, dann könnte man viel mehr damit anstellen. :cry: |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Zitat:
Beispiel:
Delphi-Quellcode:
type
TFoo<T: class, constructor> = class function CreateNewObject: T; procedure FreeAndNil(var AObject: T); function GetClassName: string; end; { TFoo<T> } function TFoo<T>.CreateNewObject: T; begin Result := T.Create; end; procedure TFoo<T>.FreeAndNil(var AObject: T); begin AObject.Free; AObject := nil; end; function TFoo<T>.GetClassName: string; begin Result := T.ClassName; end; |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
geht nicht
Delphi-Quellcode:
Statt class, constructor oder record wäre es schöner, wenn man auch direkt Typen angeben könnte,
type
TFoo<T: class, constructor> = class procedure DoTest; end; procedure TFoo<T>.DoTest; begin T.Test; end; bzw. wenn der Code erstmal nur auf korrekte Syntag geprüft und erst bei Nutzung, mit dem "Zieltyp" weiter geprüft würde. |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Zitat:
Delphi-Quellcode:
In dem Beispiel rufst du übrigens eine Methode auf eine Klasse auf, nur dass ich das erwähnt habe...
type
TFoo = class procedure Test; end; TFoo2<T: TFoo> = class procedure DoTest; end; procedure TFoo2<T>.DoTest; begin T.Test; end; procedure TFoo.Test; begin end; Kann es sein, dass du das mit den Generics noch nicht ganz verstanden hast? |
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Das sage ich ja "man kann auf keine Eigenschaften und Methoden eines generischen Typs zugreifen".
|
AW: generischen Typen als "irgendeinen" String-Typen deklarieren
Zitat:
Delphi-Quellcode:
type
TFoo = class private FCaption: string; public procedure Bar; property Caption: string read FCaption write FCaption; end; TFooContainer<T: TFoo> = class procedure DoSomething(x: T); end; procedure TFooContainer<T>.DoSomething(x: T); begin x.Caption := 'Hello Himi'; x.Bar(); end; procedure TFoo.Bar; begin ShowMessage(FCaption); end; var foo: TFoo; begin foo := TFoo.Create; with TFooContainer<TFoo>.Create do begin DoSomething(foo); Free; end; foo.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 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