![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли привести интерфейс к классу [D5]
id_privin © (2003-01-04 14:22:00)Итак есть интерфейс
IFoo = interface
["{...}"]
procedure P;
end;
его реализация
TFoo = class(TComponent,IFoo)
procedure P;
property Bar : TObject;
end;
procedure TFoo.P
begin
if not Assigned(Bar) then <Exception>
end;
делаю так
var
Foo : IFoo;
begin
Foo := TFoo.Create(nil);
TFoo(Foo).Bar := TSomeObject.Create;
Foo.P; <= Exception Here
end;
То есть объект не присвоился. В чем дело?
id_privin (2003-01-04 16:01:00) [1]
> Дмитрий Баранов © (04.01.03 15:30)
Если бы все было так просто Ж))
Но есть базовый абстрактный класс и он использует интерфейс. В потомке надо в одном месте (в конструкторе) задать реализацию для интерфейса. А в другом месте ( в функции специфичной для этого потомка присвоить реализации интерфейса это самое свойство )
> AngeL B. (04.01.03 15:42)
Угу, Угу. Один указатель к другому ну ни как. Пусть это не безопасно (да простят меня Отцы), но на мой взляд
TypeA(TypeB(ObjectOfTypeA)) должно срабатывать корректно, или я не понимаю что такое Type()
AngeL B. (2003-01-04 15:42:00) [2]
> Значит унаследовать от интерфейса
От интерфейса никто не наследует. Его реализуют. И как его реализуют и чем его реализуют неизвестно (инкапсуляция), так что привести непонятно к чему интерфейс нельзя.
Дмитрий Баранов (2003-01-04 15:30:00) [3]Var ObjFoo: TFoo;
pFoo : IFoo;
...
ObjFoo:=TFoo.Create;
IFoo := ObjFoo as IFoo;
// неявно вызывается QueryInterface.
if (IFoo == nil) then raise...
id_privin (2003-01-04 14:51:00) [4]Весело! Значит унаследовать от интерфейса можно а привести обратно нельзя. ООП отдыхает. Ну буду извращаться тогда.
icWasya (2003-01-04 14:38:00) [5]
> Можно ли привести интерфейс к классу
Нет.
а поэтому
> TFoo(Foo).Bar := ....
работать не будет