Главная страница
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.021 c
1-11295
Dennis S
2002-10-22 15:04
2002.11.04
Че это за ошибка такая???


7-11510
bob5
2002-08-05 07:49
2002.11.04
Про DLL


14-11492
qube
2002-10-15 10:37
2002.11.04
Опрос: последняя книга, которая...


14-11419
RealDummy
2002-10-15 01:09
2002.11.04
Найти производную от x в степени x


1-11332
DN
2002-10-24 11:26
2002.11.04
Неободимо удалить строку из MEMO,