Differing implementations for a function in two interfaces

Hasan Aljudy hasan.aljudy at gmail.com
Sat Apr 15 12:44:22 PDT 2006


I didn't read/undertstand your entire post, but I think what you're 
trying to achieve here can already be achieved through polymorphism.

I think you just need to redeisgn the classes a little bit.

Lionello Lunesu wrote:
> Hi,
> 
> Like the subject says, I have two interfaces that both declare some 
> function, say "int get();", but in the class that implements these 
> interfaces I'd like to differentiate between the two.
> 
> #interface IA {
> #    int get();
> #}
> 
> #interface IB {
> #    int get();
> #}
> 
> #class C : IA, IB {
> #    int get() { return 1; }
> #}
> 
> I would like to implement IA.get() differently from IB.get(), but is 
> this even possible? Can't find anything on this in the docs.
> 
> Actually, what I'm trying to do is create multiple foreach/opApply's in 
> one class, depending on which interface you use, specifically a wrapper 
> for the sqlite "sqlite3_stmt" handle. I'd like to be able to iterate the 
> rows in a result set, and the fields in a row.
> 
> At the moment I do this:
> 
> #// handle wrapper, RAII
> #class Command {
> #    sqlite3_stmt* stmt;
> #    ~this() { sqlite3_finalize(stmt); }
> #    Result Execute() { return new Result(this); }
> #}
> 
> #class Result {
> #    Command cmd;
> #    // this one iterates rows; does new ResultRow(cmd)
> #    int opApply( int delegate(inout ResultRow) dg );
> #}
> 
> #class ResultRow {
> #    Command cmd;
> #    // this one iterates fields; does new ResultField(cmd,fieldno);
> #    int opApply( int delegate(inout ResultField) dg );
> #}
> 
> #class ResultField {
> #    Command cmd;
> #    uint fieldno;
> #}
> 
> This works just fine, but a lot of temporary objects are created, that 
> don't really contain anything new, just a reference to the Command 
> object. I would like to use interfaces instead:
> 
> #interface IResult {
> #    // this one iterates rows
> #    int opApply( int delegate(inout IResultRow) dg );
> #}
> 
> #interface IResultRow {
> #    // this one iterates fields
> #    int opApply( int delegate(inout ResultField) dg );
> #}
> 
> #// As before, since we need to keep track of the field index
> #class ResultField {
> #    Command cmd;
> #    uint fieldno;
> #}
> 
> #class Command : IResult, IResultRow {    // handle wrapper
> #    sqlite3_stmt* stmt;
> #    ~this() { sqlite3_finalize(stmt); }
> #    IResult Execute() { return cast(IResult)this; }
> #    // this one iterates rows; does cast(IResultRow)this
> #    int IResult.opApply( int delegate(inout IResultRow) dg );
> #    // this one iterates fields; does new ResultField(this,fieldno)
> #    int IResultRow.opApply( int delegate(inout IResultField) dg );
> #}
> 
> Or is there a solution to this pattern I haven't thought of yet?
> 
> All comments are appreciated :)
> 
> L.



More information about the Digitalmars-d-learn mailing list