Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Generics (https://www.delphipraxis.net/193885-generics.html)

TigerLilly 19. Sep 2017 15:00

Generics
 
Wenn ich versuche, das zu komplilieren
Delphi-Quellcode:
type
  TEventChain<T> = class
    constructor Create;
    destructor Destroy;
    procedure ChainEvent(NewEvent: T);
    function AttachEvent(OldEvent:T):T;
    procedure BaseEvent<T>;
  end;
bekomme ich für BaseEvent
Delphi-Quellcode:
[dcc32 Hinweis] Unit4.pas(19): H2509 Bezeichner 'T' steht im Konflikt mit Typparametern des Container-Typs
Warum?

Ich würde gern sowas machen: XY:=TEventChain<TNotifyEvent>.create;

Und hier

Delphi-Quellcode:
function TEventChain<T>.AttachEvent(OldEvent: T): T;
begin
  Result := BaseEvent;
  EventList.Add(OldEvent);
end;
erhalte ich
Delphi-Quellcode:
[dcc32 Fehler] Unit4.pas(74): E2531 Methode 'BaseEvent' erfordert explizite Typargumente
Was übersehe ich da?

Zacherl 19. Sep 2017 16:43

AW: Generics
 
Delphi-Quellcode:
BaseEvent<T>
statt nur
Delphi-Quellcode:
BaseEvent
unten in der Funktion sollte das Problem beheben. Der Typ kann in diesem Falle nicht automatisch abgeleitet werden.

TigerLilly 19. Sep 2017 16:46

AW: Generics
 
Nope.

Delphi-Quellcode:
[dcc32 Fehler] Unit4.pas(76): E2010 Inkompatible Typen: 'T' und 'procedure, untyped pointer or untyped parameter'

Uwe Raabe 19. Sep 2017 16:48

AW: Generics
 
Wie schon gesagt: Da nichts über T bekannt ist, kannst du T auch nicht aufrufen oder eine Methode als T zurückgeben. Was du vorhast, geht so nicht.

TigerLilly 19. Sep 2017 17:21

AW: Generics
 
Ok, ja, das hat Sinn, wenn man es so betrachtet. Danke!

Zacherl 19. Sep 2017 17:24

AW: Generics
 
Bist du sicher, dass
Delphi-Quellcode:
BaseEvent
nicht eigentlich
Delphi-Quellcode:
function BaseEvent: T
sein soll, statt
Delphi-Quellcode:
procedure BaseEvent<T>
? Anders macht es nämlich nicht wirklich Sinn.

TigerLilly 19. Sep 2017 17:28

AW: Generics
 
Das passt schon so. Der Aufruf wäre so:

AttachEvent(grid.OnResize);

Und die Methode sichert den aktuellen Event in einer Liste und weist einen neuen Event zu - eben BaseEvent, der dann dafür sorgt, dass der alte Event und allfällige weitere aufgerufen wird.

Das war der Plan :- )

Zacherl 19. Sep 2017 17:52

AW: Generics
 
Delphi-Quellcode:
Result := BaseEvent
klappt aber trotzdem nur, wenn
Delphi-Quellcode:
BaseEvent
eine
Delphi-Quellcode:
function
ist :P

TigerLilly 19. Sep 2017 18:00

AW: Generics
 
So geht´s natürlich - ohne Generics:

Delphi-Quellcode:
 TNotifyEventChain = class
    EventList: IList<TNotifyEvent>;
    constructor Create;
    destructor Destroy;
    procedure ChainEvent(NewEvent: TNotifyEvent);
    function AttachEvent(OldEvent:TNotifyEvent):TNotifyEvent;
    procedure BaseEvent(Sender:TObject);
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11: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