среда, 17 апреля 2013 г.

Ещё для затравки...

Чем плоха конструкция:


ImyInterface = interface(IUnknown)
end;//ImyInterface
 
TA = class(TInterfacedObject, ImyInterface)
end;//TA
 
TB = class(TA, ImyInterface)
end;//TB


-- расскажу позже.

В двух словах - можно получить от ОДНОГО объекта две ссылки на ImyInterface, которые будут вести себя по-разному.

Например так:


function TA.SomeMethod: ImyInterface;
begin
 Result := Self;
end;
 
...
var
 l_X : TB;
 l_A : ImyInterface;
 l_B : ImyInterface;
begin
 l_X := TB.Create;
 l_A := l_X.SomeMethod;
 l_B := l_X As ImyInterface;
 Assert(l_A = l_B, 'Улыбайтесь пошире и удивляйтесь :-)');
end;


или так:




var
 l_X : TA;
 l_A : ImyInterface;
 l_B : ImyInterface;
begin
 l_X := TB.Create;
 l_A := l_X;
 l_B := l_X As ImyInterface;
 Assert(l_A = l_B, 'Улыбайтесь пошире и удивляйтесь :-)');
end;

Комментариев нет:

Отправить комментарий