AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein was ist der Sinn von Templates/Generics ?
Thema durchsuchen
Ansicht
Themen-Optionen

was ist der Sinn von Templates/Generics ?

Ein Thema von paule32.jk · begonnen am 7. Okt 2024 · letzter Beitrag vom 9. Okt 2024
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: was ist der Sinn von Templates/Generics ?

  Alt 7. Okt 2024, 20:15
ohne das jetzt getestet zu Haben:
- können Generics "vererbt" werden (also die Klassen durch Sub-Classing erweitert werden ?
Ja, du kannst den generischen Typ dabei durch einen konkreten Typ ersetzen, also TSubClass = class(TMyValue<Integer>) , oder wieder nach außen als neuen generischen Typ durchreichen, also TSubClass<T> = class(TMyValue<T>) . Beides habe ich schon sehr oft verwendet.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: was ist der Sinn von Templates/Generics ?

  Alt 7. Okt 2024, 21:07
Delphi-Quellcode:
TMyValue = class
  function GetValue<T>: T;
  procedure SetValue<T>(Value: T);
end;

TMyValue<T> = class
  function GetValue: T;
  procedure SetValue(Value: T);
end;


TMyValue<T> = class
  procedure Machwas<X>(Value: T; Other: X);
end;
Sie Weiteres auch in der OH/DocWiki.
* mehrere Typen können angegeben werden
* es können Einschränkungen Mindestanforderungen für diese Typen vorgegeben werben
* uvm.


Es kann sogar eine teilweise Automatik (Inferenz) genutzt, wo der Compiler z.B. anhand der übergebenen Variable das T selbst bestimmt.
Delphi-Quellcode:
MyValue.SetValue<Integer>(MyInt);
MyValue.SetValue(MyInt);
bei Value: T aber leider nicht bei Value: array of T
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: was ist der Sinn von Templates/Generics ?

  Alt 8. Okt 2024, 12:30
aber leider nicht bei Value: array of T
konnte ich mir schon Denken, da dies ein wenig blääedde ist ...
na gut, man kann nicht alles Haben (aber lieber auf der Bank ein Haben haben, als Soll zollen...)
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: was ist der Sinn von Templates/Generics ?

  Alt 8. Okt 2024, 12:50
Delphi-Quellcode:
type
    QChar<T> = class
    public
        type
        QChar_Category = (
            Mark_NonSpacing = 0,
            Mark_SpacingCombining = 1
        );
    private
        FCategory: QChar_Category;
    public
        constructor Create;
    published
        property Category: QChar_Category read FCategory default Other_NotAssigned;
    end;
bei oben stehenden Code erhalte ich dann die Meldung:

Code:
[dcc64 Fehler] QCharClass.pas(392): E2146 Standardwerte müssen vom Typ Ordinal, Pointer oder vom Typ small Set sein
und beim default Constructor erhalte ich dann:

Code:
constructor QChar.Create;
[dcc64 Fehler] QCharClass.pas(419): E2003 Undeklarierter Bezeichner: 'QChar'
constructor QChar<T>.Create; funktioniert dann wieder (als member function).

Ich habe das jetzt noch nicht weiter getestet; aber: dann ist ja auch:
Code:
foo := QChar.Create;
nicht möglich, weil, dann fehlt ja Typ, den man eigentlich mit <T> im Epilog des Klassen-Codes angegeben hat ?
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: was ist der Sinn von Templates/Generics ?

  Alt 8. Okt 2024, 12:59
Wie gesagt, man kann die Deklaration des Generics an den Typ/Klasse hängen, dann muß es immer angegeben werden, und betrifft die ganze Klasse.

Oder man hängt ihn an die Methode(n), wo es dann jeweils nur diese Methode betrifft und man den Typen selbst auch ohne nutzen kann.

Oder man definiert sich eben einen aufgelösten Alias Typen damit.
Delphi-Quellcode:
type
  QChar<T> = class
    ...
  end;

  QChar = QChar<string>;

konnte ich mir schon Denken, da dies ein wenig blääedde ist ...
Betrifft nur die Automatik ... wenn man das <xyz> angibt, dann geht's.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 8. Okt 2024 um 13:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: was ist der Sinn von Templates/Generics ?

  Alt 8. Okt 2024, 13:37
bei oben stehenden Code erhalte ich dann die Meldung:

Code:
[dcc64 Fehler] QCharClass.pas(392): E2146 Standardwerte müssen vom Typ Ordinal, Pointer oder vom Typ small Set sein
Das ist richtig, aber du kannst das ja auch im Code setzen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: was ist der Sinn von Templates/Generics ?

  Alt 8. Okt 2024, 14:46
ich habe nun folgendes...
Delphi-Quellcode:
unit QCharClass;

interface
type
    QChar<T> = class
    protected
        function getOrigin: uint64;
    public
        constructor Create; overload;
        ...
    end;

implementation

function check_ptr(name: PChar; ptr: uint64): Boolean;
begin
  result := false;
  if ptr = 0 then
  begin
    ErrorMessage(PChar(Format('Error: %s not constructed.',[name])));
    exit;
  end;
  result := true;
end;

constructor QChar<T>.Create;
begin
    inherited Create;

    if not check_ptr(ClassName, getOrigin) then
    begin Free; exit; end;
end;

end.
ergibt dann:
Code:
[dcc64 Fehler] QCharClass.pas(429): E2506 Im interface-Abschnitt deklarierte Methode des parametrisierten Typs darf kein lokales Symbol 'check_ptr' verwenden
heißt das nun, ich kann keine Funktionen/Prozeduren im implementation's-Bereich stehen, und nicht direkt mit der QChar<T> zu tun haben, mehr schreiben ?
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#18

AW: was ist der Sinn von Templates/Generics ?

  Alt 8. Okt 2024, 15:13
Bei einer generischen Klasse kann der Compiler den eigentlichen Code erst erzeugen, wenn der tatsächliche Typ von T bekannt ist. Daher gibt es diese Einschränkung.

Alternativ kannst du die function check_ptr als Methode der Klasse deklarieren (dann wäre sie ja auch im Interface Part) oder als lokale function innerhalb von QChar<T>.Create (wenn sie nicht noch anderswo verwendet wird).

Abgesehen davon sieht man in deinem Code gar nicht, warum er überhaupt generisch ist. Das T wird nirgendwo verwendet - zumindest nicht in dem Teil den du zeigst. Ich bringe das deswegen auf den Tisch, da es manchmal sinnvoller ist, eine nicht generische Basisklasse zu haben und von der dann ein generische Ableitung zu erstellen, die sich rein um den generischen Part kümmert.

Delphi-Quellcode:
type
    QChar = class
    protected
        function getOrigin: uint64;
    public
        constructor Create; overload;
        ... // alles was nicht mit T zu tun hat
    end;

    QChar<T> = class(QChar)
      ... // alles was mit T zu tun hat
    end;

implementation

function check_ptr(name: PChar; ptr: uint64): Boolean;
begin
  result := false;
  if ptr = 0 then
  begin
    ErrorMessage(PChar(Format('Error: %s not constructed.',[name])));
    exit;
  end;
  result := true;
end;

constructor QChar.Create;
begin
    inherited Create;

    if not check_ptr(ClassName, getOrigin) then
    begin Free; exit; end;
end;
Übrigens: das Free innerhalb des Create ist etwas irritierend.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: was ist der Sinn von Templates/Generics ?

  Alt 8. Okt 2024, 15:37
Wozu Free?
Erst garnicht erzeugen, wenn nicht nötig oder möglich.

Delphi-Quellcode:
type
  QChar = class
  private // or protected or public
    class function check_ptr(name: PChar; ptr: uint64): Boolean; static;
  protected
    function getOrigin: uint64;
  public
    //constructor Create;
    //class function Create: QChar; static; // intern nur dann erzeugen, wenn nötig
    class function CreateOrNot: QChar; static; // da dieses "Create" unerwartet auch NIL zurückgeben kann, sollte das auch ersichtlich sein.
  end;

class function QChar.check_ptr(name: PChar; ptr: uint64): Boolean;
begin
  Result := ptr <> 0;
  if not Result then
    ErrorMessage(PChar(Format('Error: %s not constructed.',[name])));
end;

class function QChar.CreateOrNot: QChar;
begin
  Result := nil;
  if check_ptr(ClassName, getOrigin) then
    Result := inherited Create;
end;



x := QChar.CreateOrNot;
if Assigned(x) then
  ...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 8. Okt 2024 um 15:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: was ist der Sinn von Templates/Generics ?

  Alt 8. Okt 2024, 15:44
Delphi-Quellcode:
type
    QChar = class
    protected
        function getOrigin: uint64;
    public
        constructor Create; overload;
        ... // alles was nicht mit T zu tun hat
    end;

    QChar<T> = class(QChar)
      ... // alles was mit T zu tun hat
    end;
das sieht sehr gut aus !

Übrigens: das Free innerhalb des Create ist etwas irritierend.
das Free ist von mir dazu gedacht, den Speicher freizugeben, wenn bei der Überprüfung der Pointer nil ergibt.
Man könnte das auch auslagern. Aber ich dachte mir, da der Code in einer DLL liegt, das auslösen einer Exception nicht so dolle erscheinen mag.

das ganze kann auch hier eingesehen werden.
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet

Geändert von paule32.jk ( 8. Okt 2024 um 16:58 Uhr) Grund: Code-Abschnitt gelöscht
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 15:12 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