AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language generischen Typen als "irgendeinen" String-Typen deklarieren
Thema durchsuchen
Ansicht
Themen-Optionen

generischen Typen als "irgendeinen" String-Typen deklarieren

Ein Thema von himitsu · begonnen am 12. Sep 2010 · letzter Beitrag vom 13. Sep 2010
Antwort Antwort
Seite 2 von 2     12   
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#11

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 19:54
Für eine gleichzeitige Ansi/Unicode-Programmierung ist diese besch** Generic-Implementierung absolut nicht zu gebrauchen.
Das liegt vielleicht daran, dass für dein Vorhaben Templates notwendig sind und Delphi hat diese nicht. Delphi hat hier nur Generics im Angebot (die auch noch ein paar Bugs haben). Bei C# hättest du die selben Probleme (bis auf dass String dort ein object ist und somit über ToSring() verfügt, aber im Endeffekt würdest du dort dann auch wieder alles nach Unicode-String konvertieren, damit arbeiten und zurückschreiben).
Generics sind nun mal keine C++Templates.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#12

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 19:58
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. (Quelle)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (13. Sep 2010 um 20:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 20:07
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#14

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 20:10
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.
Das stimmt nicht. Sofern du einen Constraint setzt, kannst du innerhalb der Methoden deiner Klasse problemlos auf Eigenschaften und Methoden des generischen Typs zugreifen, du musst nur unter Umständen T auf deine Klasse/Interface umcasten.

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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (13. Sep 2010 um 20:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 20:58
geht nicht
Delphi-Quellcode:
type
  TFoo<T: class, constructor> = class
    procedure DoTest;
  end;

procedure TFoo<T>.DoTest;
begin
  T.Test;
end;
Statt class, constructor oder record wäre es schöner, wenn man auch direkt Typen angeben könnte,
bzw. wenn der Code erstmal nur auf korrekte Syntag geprüft und erst bei Nutzung, mit dem "Zieltyp" weiter geprüft würde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Sep 2010 um 21:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#16

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 22:06
geht nicht
Delphi-Quellcode:
type
  TFoo<T: class, constructor> = class
    procedure DoTest;
  end;

procedure TFoo<T>.DoTest;
begin
  T.Test;
end;
Statt class, constructor oder record wäre es schöner, wenn man auch direkt Typen angeben könnte,
bzw. wenn der Code erstmal nur auf korrekte Syntag geprüft und erst bei Nutzung, mit dem "Zieltyp" weiter geprüft würde.
Und seit wann hat TObject ne Methode namens Test?
Delphi-Quellcode:
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;
In dem Beispiel rufst du übrigens eine Methode auf eine Klasse auf, nur dass ich das erwähnt habe...

Kann es sein, dass du das mit den Generics noch nicht ganz verstanden hast?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (13. Sep 2010 um 22:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 22:13
Das sage ich ja "man kann auf keine Eigenschaften und Methoden eines generischen Typs zugreifen".
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#18

AW: generischen Typen als "irgendeinen" String-Typen deklarieren

  Alt 13. Sep 2010, 22:20
Das sage ich ja "man kann auf keine Eigenschaften und Methoden eines generischen Typs zugreifen".
Logisch, wenn du keine Instanz davon hast, oder?
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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 11:39 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