AGB  ·  Datenschutz  ·  Impressum  







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

Klasseninstanz zur Laufzeit bestimmen

Ein Thema von Delbor · begonnen am 1. Aug 2015 · letzter Beitrag vom 4. Aug 2015
 
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Klasseninstanz zur Laufzeit bestimmen

  Alt 2. Aug 2015, 08:11
Nun ja, bei XE4 gibt es natürlich auch schon nettere Arten, damit umzugehen
Delphi-Quellcode:
unit Unit1;

interface

uses
  {System.}Generics.Collections,
  {System.}SysUtils;

type
  TObjectHandler = class abstract
  private type
    TAction = TProc<TObject>;
  private
    FRoutes: TDictionary<TClass, TAction>;
  protected type
    TRoute<T> = procedure( Argument: T ) of object;
  protected
    procedure RegisterRoute<T: class>( ARoute: TRoute<T> );
    procedure DoRaise( Argument: TObject );
  end;

  TFoo = class

  end;

  TBar = class

  end;

  TFooBar = class( TObjectHandler )
  private
    procedure Apply( Argument: TFoo ); overload;
    procedure Apply( Argument: TBar ); overload;
  public
    constructor Create( );

    procedure Handle( Argument: TObject );
  end;

implementation

{ TObjectHandler }

procedure TObjectHandler.DoRaise( Argument: TObject );
var
  LAction: TAction;
begin
  if FRoutes.TryGetValue( Argument.ClassType, LAction ) then
    LAction( Argument )
  else
    raise ENotImplemented.CreateFmt( 'Handler für %s fehlt', [ Argument.ClassName ] );
end;

procedure TObjectHandler.RegisterRoute<T>( ARoute: TRoute<T> );
begin
  FRoutes.Add( T,
    procedure( Argument: TObject )
    begin
      ARoute( Argument as T );
    end );
end;

{ TFooBar }

procedure TFooBar.Apply( Argument: TFoo );
begin

end;

procedure TFooBar.Apply( Argument: TBar );
begin

end;

constructor TFooBar.Create;
begin
  inherited Create;
  RegisterRoute<TFoo>( Apply );
  RegisterRoute<TBar>( Apply );
end;

procedure TFooBar.Handle( Argument: TObject );
begin
  DoRaise( Argument );
end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
 


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 06:53 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 by Thomas Breitkreuz