Implement a Delphi interface using an 'anonymous' class -


i have interface.

type iprogressobserver = interface(iinterface)     procedure reportprogress(progress:integer);     procedure reporterror(message:string); end; 

i have implemented interface using named class, follows:

type tprogressobserver=class(tinterfacedobject, iprogressobserver)         procedure reportprogress(progress:integer);     procedure reporterror(message:string); end;  ... implementation of methods go here .....  addprogressobserver(tprogressobserver.create); 

is possible create instance of interface without declaring class? (imaginary) code, same thing above:

 addprogressobserver(iprogressobserver.create()  begin    procedure reportprogress(progress:integer)    begin      showmessage('progress observed!');    end     procedure reporterror(message:string)    begin      log(message);    end  end;); 

delphi has anonymous procedures, have anonymous classes??

i found this similar question, it's in java.

i using delphi 2010

you can pretty anonymous, implementing interface using anonymous methods. don't actual compiler support this, you'll have declare anonymous method types yourself, implement actual "anonymous" class. given iprogressobserver interface, implementation this:

type   // interface we'll dealing with.   iprogressobserver = interface(iinterface)     procedure reportprogress(progress:integer);     procedure reporterror(message:string);   end;    // anonymously create implementations of iprogressobserver   // interface.   tanonymousobserverimp = class(tinterfacedobject, iprogressobserver)   type     // declare reference types methods interface needs.     treportprogressproc = reference procedure(progress:integer);     treporterrorproc = reference procedure(message:string);   strict private     freportprogressproc: treportprogressproc;     freporterrorproc: treporterrorproc;      // actual implementation of interface methods.     procedure reportprogress(progress:integer);     procedure reporterror(message:string);     // private constructor, we'll forced use public "construct" function     constructor create(areportprogressproc: treportprogressproc; areporterrorproc: treporterrorproc);   public     // takes required anonymous methods parameters , constructs anonymous implementation     // of iprogressobserver interface.     class function construct(areportprogressproc: treportprogressproc; areporterrorproc: treporterrorproc): iprogressobserver;   end;  { tanonymousobserverimp }  class function tanonymousobserverimp.construct(   areportprogressproc: treportprogressproc;   areporterrorproc: treporterrorproc): iprogressobserver; begin   // call private constructor   result := tanonymousobserverimp.create(areportprogressproc, areporterrorproc); end;  constructor tanonymousobserverimp.create(   areportprogressproc: treportprogressproc; areporterrorproc: treporterrorproc); begin   inherited create;   // save references later use   freportprogressproc := areportprogressproc;   freporterrorproc := areporterrorproc; end;  procedure tanonymousobserverimp.reporterror(message: string); begin   // delegate anonymous method   freporterrorproc(message); end;  procedure tanonymousobserverimp.reportprogress(progress: integer); begin   // delegate anonymous method   freportprogressproc(progress); end; 

once code in place you'll able write code this:

var i: iprogressobserver; begin   := tanonymousobserverimp.construct(     procedure (progress:integer)     begin       // progress     end     ,     procedure (message:string)     begin       // message     end   ) end; 

looks pretty anonymous me! given implementation of anonymous methods in delphi it's fast , effective.


Comments

Popular posts from this blog

c# - How to set Z index when using WPF DrawingContext? -

razor - Is this a bug in WebMatrix PageData? -

visual c++ - Using relative values in array sorting ( asm ) -