Как навести предок интерфейса на потомка? - PullRequest
0 голосов
/ 01 декабря 2018

В следующем фрагменте кода:

type
    IFoo = interface
    end;

    IFoo<T> = interface(IFoo)
        procedure DoStuff(a: T);
    end;

    TFoo = class(TInterfacedObject, IFoo<Integer>, IFoo<string>, IFoo)
        procedure DoStuffInt(a: Integer);
        procedure DoStuffStr(a: string);
        procedure IFoo<Integer>.DoStuff = DoStuffInt;
        procedure IFoo<string>.DoStuff = DoStuffStr;
    end;

procedure TFoo.DoStuffInt(a: Integer);
begin
    Showmessage(a.ToString);
end;

procedure TFoo.DoStuffStr(a: string);
begin
    ShowMessage(a);
end;

var
    iint: IFoo<Integer>;
    istr: IFoo<string>;
    i: IFoo;
begin
    i := TFoo.Create;
    IFoo<integer>(i).DoStuff(123);  // error
    IFoo<string>(i).DoStuff('abc'); // error
end.

Я хочу вызвать методы DoStuff, но это не работает так, как я это сделал.Как правильно разыграть?

Детали: У меня будет фабрика, которая будет производить экземпляры IFoo, а затем мне придется отливать их в конкретные IFoo.

Отредактировано: для одного интерфейса нормально работает:

type
    IFoo = interface
    end;

    IFoo<T> = interface(IFoo)
        procedure DoStuff(a: T);
    end;

    TFoo = class(TInterfacedObject, IFoo<integer>, IFoo)
        procedure DoStuff(a: Integer);
    end;

procedure TFoo.DoStuff(a: Integer);
begin
    Showmessage(a.ToString);
end;

var
    i: IFoo;
begin
    i := TFoo.Create;
    IFoo<Integer>(i).DoStuff(123);
    // curiosity
    IFoo<string>(i).DoStuff('abc'); // it call DoStuff(a: Integer)
...