Форум: "Основная";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
ВнизМожно ли привести интерфейс к классу Найти похожие ветки
← →
id_privin (2003-01-04 14:22) [0]Итак есть интерфейс
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;
То есть объект не присвоился. В чем дело?
← →
icWasya (2003-01-04 14:38) [1]
> Можно ли привести интерфейс к классу
Нет.
а поэтому
> TFoo(Foo).Bar := ....
работать не будет
← →
id_privin (2003-01-04 14:51) [2]Весело! Значит унаследовать от интерфейса можно а привести обратно нельзя. ООП отдыхает. Ну буду извращаться тогда.
← →
Дмитрий Баранов (2003-01-04 15:30) [3]Var ObjFoo: TFoo;
pFoo : IFoo;
...
ObjFoo:=TFoo.Create;
IFoo := ObjFoo as IFoo;
// неявно вызывается QueryInterface.
if (IFoo == nil) then raise...
← →
AngeL B. (2003-01-04 15:42) [4]
> Значит унаследовать от интерфейса
От интерфейса никто не наследует. Его реализуют. И как его реализуют и чем его реализуют неизвестно (инкапсуляция), так что привести непонятно к чему интерфейс нельзя.
← →
id_privin (2003-01-04 16:01) [5]
> Дмитрий Баранов © (04.01.03 15:30)
Если бы все было так просто Ж))
Но есть базовый абстрактный класс и он использует интерфейс. В потомке надо в одном месте (в конструкторе) задать реализацию для интерфейса. А в другом месте ( в функции специфичной для этого потомка присвоить реализации интерфейса это самое свойство )
> AngeL B. (04.01.03 15:42)
Угу, Угу. Один указатель к другому ну ни как. Пусть это не безопасно (да простят меня Отцы), но на мой взляд
TypeA(TypeB(ObjectOfTypeA)) должно срабатывать корректно, или я не понимаю что такое Type()
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c