Раз Unit - интерфейс, то заведи метод OnPlace, но у базового класса Unit он просто будет пустым. Т.е. вызывай его всегда. А конкретный Unit реализует то, что ему надо.
Дженерик тут вообще не нужен. Просто внутри метода Unit проверяй, какой объект вызывал метод
Пример на Delphitype
IUnit = interface;
ILane = interface
['{494F502B-7659-4C5F-B72A-B6BFBF67F9B7}']
procedure Place(Item: IUnit);
end;
IGroundLane = interface(ILane)
['{02D598FF-2AA9-4752-B808-44F8FE909B7B}']
end;
IUnit = interface
['{4EB084E7-9F79-40B6-92C0-A1A8C794F025}']
procedure OnPlace(Sender: ILane);
end;
TUnit = class(TInterfacedObject, IUnit)
procedure OnPlace(Sender: ILane); virtual;
end;
TMyUnit = class(TUnit)
procedure OnPlace(Sender: ILane); override;
end;
TLane = class(TInterfacedObject, ILane)
procedure Place(Item: IUnit);
end;
impl
{ TUnit }
procedure TUnit.OnPlace(Sender: ILane);
begin
// do nothing
end;
{ TLane }
procedure TLane.Place(Item: IUnit);
begin
//add item
Item.OnPlace(Self);
end;
{ TMyUnit }
procedure TMyUnit.OnPlace(Sender: ILane);
var
Lane: IGroundLane;
begin
if Supports(Sender, IGroundLane, Lane) then
// it's IGroundLane
end;