Einzelnen Beitrag anzeigen

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