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
Post a Comment