![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наследование и интерфейсы [D5, WinXP]
harisma © (2008-10-23 12:18:00)Господа! Нужна помощь!
Есть классы:
TSomeObject = class
protected
{Declare IMyInterface2 methods}
procedure Method1; safecall;
procedure Method2; safecall;
procedure Method3; safecall;
function Method4: OLEVariant; safecall;
end;
TMyClass = class(TSomeClass, IMyInterface1, IMyInterface2)
FSomeObject: TSomeObject;
protected
{ declare IMyInterface1 methods}
procedure Method1; safecall;
function Method2: WideString; safecall;
public
property SomeObject: TSomeObject read FSomeObject implementation IMyInterface2;
end;
Суть задачи:
Я хочу создать некий базовый абстрактный класс, от которого порождался бы класс TSomeObject и в него перенести объявление и реализацию некоторых методов интерфейса IMyInterface2. Но некоторые методы интерфейса в этом классе я бы хотел объявить как абстрактные:
TSomeObjectBase = class
protected
procedure Method1; virtual; abstract; safecall;
procedure Method2; virtual; safecall;
function Method4: OLEVariant; virtual; safecall;
end;
TSomeObject = class(TSomeObjectBase)
protected
procedure Method1; override; safecall;
procedure Method3; safecall;
function Method4: OLEVariant; override; safecall;
end;
Проблема:
1. Почему нельзя объявлять метод абстрактным?
procedure Method1; virtual; abstract; safecall;
2. Если так нельзя, как все же объявить такой метод?
3. Обязательно ли писать в классе TSomeObject у методов-реализаций интерфейса IMyInterface2 директиву safecall или ее можно опустить, так как она уже указана в базовом классе? Если можно, укажите, где это можно прочесть?
Заранее благодарю.
harisma (2008-10-23 14:00:00) [1]
> если в базовом уже указано, то необязательно
Отлично. Спасибо!!! :)
Тема закрыта.
Palladin (2008-10-23 13:46:00) [2]ах вот оно как... если в базовом уже указано, то необязательно... соглашение о вызове так же наследуется.
harisma (2008-10-23 13:24:00) [3]Так я писал в сути задачи:
> TSomeObjectBase = class
> protected
> procedure Method1; virtual; abstract; safecall;
> procedure Method2; virtual; safecall;
> function Method4: OLEVariant; virtual; safecall;
> end;
>
> TSomeObject = class(TSomeObjectBase)
> protected
> procedure Method1; override; safecall;
> procedure Method3; safecall;
> function Method4: OLEVariant; override; safecall;
>
> end;
>
А вот так я написал в коде (уже с учетом ответа на первых 2 вопроса):
TSomeObjectBase = class
protected
procedure Method1; virtual; safecall;
procedure Method2; virtual; safecall;
function Method4: OLEVariant; virtual; safecall;
end;
TSomeObject = class(TSomeObjectBase)
protected
procedure Method1; override;
procedure Method3; safecall;
function Method4: OLEVariant; override;
end;
Видишь, в классе TSomeObject, порожденном от TSomeObjectBase, у методов, которые объявлены в базовом классе НЕТ директивы safecall. Естественно, те методы, которые не объявлены в базовом классе, в классе TSomeObject имеют эту директиву.
Вот я и спрашиваю, обязательно ли писать еще раз директиву safecall в классе TSomeObject для методов, уже описанных в базовом классе?
Palladin (2008-10-23 13:08:00) [4]
> так как программа вполне корректно работает без указания
> директивы safecall в порожденном классе
интересно интересно, как это у тебя получилось? я вот сейчас попробовал и мне компилятор высказал все, что он обо мне думает..
Type
IIfc1=Interface
Procedure proc1(Const s:String;a:Integer); stdcall;
End;
TCls1=Class(TInterfacedObject,IIfc1)
Public
Procedure Proc1(Const s:String;a:Integer);
End;
Declaration of 'proc1' differs from declaration in interface 'IIfc1'
где то ты обманываешь(ся)
harisma (2008-10-23 12:32:00) [5]>To Palladin
За ответ на первых 2 вопроса спасибо.
По третьему вопросу позволь не согласиться, так как программа вполне корректно работает без указания директивы safecall в порожденном классе, но мне хотелось бы быть точно уверенным в этом.
Жду ответа на мой третий вопрос от знатоков в этой области.
Заранее спасибо.
Palladin (2008-10-23 12:23:00) [6]
> 1. Почему нельзя объявлять метод абстрактным? procedure
> Method1; virtual; abstract; safecall;
Потому что интерфейс заявляет о его существовании, а, значит, о возможности вызова.
> Если так нельзя, как все же объявить такой метод?
объявить как всегда, но без abstract, оставив тело реализации пустым.
> 3. Обязательно ли писать в классе TSomeObject у методов-
> реализаций интерфейса IMyInterface2 директиву safecall или
> ее можно опустить, так как она уже указана в базовом классе?
> Если можно, укажите, где это можно прочесть?
Подозреваю, что обязательно.