Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.04;
Скачать: CL | DM;

Вниз

delphi отказывает в приведении типа. Почему?   Найти похожие ветки 

 
deffer   (2002-10-24 18:10) [0]

есть переменная form типа TForm.

var form : TForm;

реально хранит объект класса, порожденного от TForm и реализующего IMyInterface. Попытка обратиться к form как к объекту с интерфейсом IMyInterface

IMyInterface(form).myMethod;

отбрасывается компилятором. Ошибка : Incompatible types "IMyInterface" and "TForm".

Delphi 5. Это глюк или этому есть разумное объяснение?


 
asmith   (2002-10-24 20:04) [1]

Нужно это делать таким образом:
var
mi : IMyInterface;
...
if form.GetInterface(IMyInterface, mi) then
mi.myMethod;


 
Набережных С.   (2002-10-24 20:07) [2]

Это глюк, но не в DELPHI :). Компилятор пытается найти в классе TForm интерфейс IMyInterface, а откуда ему там взяться? А то, что ты там собираешься хранить ссылку на объект другого класса - твое глубоко личное дело, компилятор это не волнует


 
deffer   (2002-10-24 21:04) [3]

to : asmith


> var
> mi : IMyInterface;
> ...
> if form.GetInterface(IMyInterface, mi) then
> mi.myMethod;


getInterface возвращает false. у меня не COM-овский интерфейс. у меня обычный интерфейс в терминах ООП. может в этом дело?

to All :
может кто чего посоветует? Ситуация вполне типична (часто используется например в Java)

TMy1Class = class (TForm, IMyInterface)
TMy2Class = class (TForm, IMyInterface)
...
TMy10Class = class (TForm, IMyInterface)

IMyInterface = interface
procedure myMethod;
end;

где-то инициализиурется переменная form объектом TMyXForm, где X зависит от разных параметров
например form:=TMy3Form.create(self);

в каком-то месте кода мне нужно получить доступ к form как к TForm так и как к IMyInterface (причем какой точно объект лежит в form мне уже неизвестно, но он точно один из My1Form .. My10Form), т.е. нужно выполнить

TForm(form).showModal;
IMyInterface(form).myMethod;

если объявить var form:TForm, то нельзя привести form к IMyInterface.
если объявить var form:IMyInterface, то вываливается с эксепцией (EPrivilege или EExternalException) приведение к TForm.

Так в чем дело? Delphi не поддерживает такое приведение типов, или это делается как-то по-хитрому?


 
Набережных С.   (2002-10-24 21:43) [4]

Нельзя интерфейс привести к типу объекта, нет для этого средств, и это вполне естественно и разумно. А смешивать работу с объектом и интерфейсом не стоит даже в такой редакции, как у тебя. Добавь в интерфейс метод GetSelf и объяви переменную типа интерфейса. И кто мешает дать интерфейсу GUID?


 
deffer   (2002-10-25 11:33) [5]

to: Набережных С.

Спасибо за идею с getSelf. Как это мне раньше в голову не пришло.

PS: А по поводу давания GUID -- я же говорю, не получается что-то. getInterface возвращает false. Вероятно с GUID-ом делается как-то не так, как я делаю.



Страницы: 1 вся ветка

Текущий архив: 2002.11.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
6-11365
Крот
2002-09-04 23:14
2002.11.04
Передача данных через сокеты


14-11392
sanilo
2002-10-17 13:03
2002.11.04
Электронная библиотека


7-11524
mate
2002-08-29 13:43
2002.11.04
Как спрятать свой процесс


1-11334
volph777
2002-10-24 11:55
2002.11.04
Как скопировать строку типа string в Clipboard?


1-11144
QUE
2002-10-24 12:25
2002.11.04
Надпись на MDIForm