![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Operator not applicable to this operand type [D6, WinXP]
XP © (2005-03-01 12:24:00)Надоело об стену стучаться головой. Подскажите, пожалуйста.
unit urInterfaces;
interface
type
IrIniFile = interface
function GetData: string; stdcall;
end;
...
//-----------------------------------------
unit urIniFile;
interfaces
uses
urInterfaces;
type
TrIniFile = class(TObject, IrIniFile)
protected
function GetData: string; stdcall;
end;
implementation
uses
urCore;
...
//-----------------------------------
unit urCore;
interface
uses
urInterfaces, urIniFile;
type
TrCore = class
private
m_IniFile: IrIniFile;
public
constructor Create;
end;
implementation
constructor TrCore.Create;
begin
m_IniFile := TrIniFile.Create as IrIniFile; // остановка компилятора
end;
На месте остановки пишет: Operator not applicable to this operand type
Вместе с тем, TrIniFile явно объявлен как class(TObject, IrIniFile).
Кроме того, IDE упорно отказывается "ходить" по исходникам по Ctrl + LeftClick.
Все файлы лежат в одной папке. Больше нигде исходников нет - только в этой папке. То-есть, использование разных DCU исключено - специально перепроверил.
Что он хочет-то?... Где это я так сильно споткнулся?...
Димон (2005-03-01 14:27:00) [1]
> [45] Набережных С. © (01.03.05 14:25)
Спасибо. Вообще говоря логично :)))
Полезная информация.
Где тут оценки ставят как на RSDN? :)))
Набережных С. (2005-03-01 14:25:00) [2]
> Димон (01.03.05 14:20) [42]
Да, если Object as interface. Если interface as interface, то вызывается метод самого исходного интерфейса.
Набережных С. (2005-03-01 14:22:00) [3]Просто надо вспомнить, что каждый интерфейс в классе - таблица, и в каждой из них свои AddRef, Release и все остальные унаследованные интерфейсом методы.
Набережных С. (2005-03-01 14:22:00) [4]Просто надо вспомнить, что каждый интерфейс в классе - таблица, и в каждой из них свои AddRef, Release и все остальные унаследованные интерфейсом методы.
Димон (2005-03-01 14:20:00) [5]
> [37] Набережных С. © (01.03.05 14:13)
Этта что получается, что все as для интерфейсов "ходят" через метод QueryInterface относительно IUnknown?
Digitman (2005-03-01 14:18:00) [6]
> Надоело об стену стучаться головой
конечно же больно)
нет бы - хрясь ! - легким движением руки унаследовать свой класс от TInterfacedobject ... так ведь - нет ! мы легких путей не ищем) ... нам геморрой в причинном месте дороже)
Набережных С. (2005-03-01 14:17:00) [7]
> XP (01.03.05 14:13) [36]
> IrIniFile порожден от IrComponent, который, в свою очередь,
> порожден от IUnknown
С точки зрения реализации интерфейса объектом, это не имеет никакого значеня. Реализован только тот, который явно объявлен в классе или в его, класса, предках. Все предки интерфейса - побоку.
vuk (2005-03-01 14:17:00) [8]to Digitman:
>декларация метода класса, реализующего интерфейс, должна в
>точности соответствовать декларации соотв.метода в декларации
>интерфейса, реализуемого этим классом
Значит так. Метод не может быть объявлен virtual при объявлении в интерфейсе (если так можно сказать, они там все virtual), но при реализации в классе метод может иметь любыемодификаторы, которые не влияют на способ передачи параметров. В приведенном примере virtual написано именно в реализации.
Димон (2005-03-01 14:14:00) [9]
> 34] Набережных С. © (01.03.05 14:05)
да, интересная информация. Никогда об этом не задумывался, т.к. всегда iunknown реализовывал, даже если не пользовался TIntefacedObject.
Благодарю :)
XP (2005-03-01 14:13:00) [10]TrIniFile = class(TObject, IUnknown, IrIniFile)
IrIniFile порожден от IrComponent, который, в свою очередь, порожден от IUnknown. См. [7].
Смысл?
2 Digitman © (01.03.05 13:59) [25]
VCL - Classes.pas
TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
...
{ IInterface }
function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
...
end;
Что сие может обозначать?...
Набережных С. (2005-03-01 14:13:00) [11]
> Димон (01.03.05 14:06) [35]
Дык время посмотри:) Когда писал, [33] еще не было. Да вроде и ничего такого не сказал...Но если все-таки обидел - искренние извинения, совершенно не хотел.
> Ты выразился не вполне понятно просто
Да, бывает со мной. Кажется, если мне очевидно, то и другим тоже. Есть такой грех:(
Димон (2005-03-01 14:06:00) [12]
> [34] Набережных С. © (01.03.05 14:05)
Я ужо извинился. Ты выразился не вполне понятно просто :)))
Набережных С. (2005-03-01 14:05:00) [13]
> Димон (01.03.05 14:03) [31]
Да ты проверь, дяденька, попробуй, в CPU View загляни, ага. Хуже-то от этого не будет:)
Димон (2005-03-01 14:05:00) [14]
> [30] Набережных С. © (01.03.05 14:03)
А... так более понятно:) Прости, не понял сначала
Набережных С. (2005-03-01 14:04:00) [15]Или TInterfacedObject и не маяться...ну сами знаете чем:)
Димон (2005-03-01 14:03:00) [16]
> [28] Набережных С. © (01.03.05 14:01)
Не-е-е-е, Ты что-то не то говоришь:))) Наверное в приведенном коде не до конца разобрался. :)
> [29] Digitman © (01.03.05 14:02)
Да знаю я :) Это наводящий вопрос бы [27] :)
Набережных С. (2005-03-01 14:03:00) [17]В общем, надо объявить так
TrIniFile = class(TObject, IUnknown, IrIniFile)
Digitman (2005-03-01 14:02:00) [18]
> Димон (01.03.05 13:59) [27]
> просто interface не эквивалент interface(IInteface)?
объявление IMyInterface = interface;
эквивалентно IMyInterface = interface(IUnknown);
подобно тому, что объявление TMyObject = class;
эквивалентно TMyObject = class(TObject);
Набережных С. (2005-03-01 14:01:00) [19]
> Димон (01.03.05 13:59) [27]
А какая разница, аналог или нет? TObject никакой не реализует.
Digitman (2005-03-01 13:59:00) [20]
> К чему это выделение virtual? Чем это может помешать?
разуваем глаза, читаем справку :
Methods cannot be declared as virtual, dynamic, abstract, or override. Since interfaces do not implement their own methods, these designations have no meaning.
декларация метода класса, реализующего интерфейс, должна в точности соответствовать декларации соотв.метода в декларации интерфейса, реализуемого этим классом