В следующем фрагменте кода:
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)