Форум: "Основная";
Текущий архив: 2009.11.15;
Скачать: [xml.tar.bz2];
ВнизНаследование и интерфейсы Найти похожие ветки
← →
harisma (2008-10-23 12:18) [0]Господа! Нужна помощь!
Есть классы:
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 или ее можно опустить, так как она уже указана в базовом классе? Если можно, укажите, где это можно прочесть?
Заранее благодарю.
← →
Palladin © (2008-10-23 12:23) [1]
> 1. Почему нельзя объявлять метод абстрактным? procedure
> Method1; virtual; abstract; safecall;
Потому что интерфейс заявляет о его существовании, а, значит, о возможности вызова.
> Если так нельзя, как все же объявить такой метод?
объявить как всегда, но без abstract, оставив тело реализации пустым.
> 3. Обязательно ли писать в классе TSomeObject у методов-
> реализаций интерфейса IMyInterface2 директиву safecall или
> ее можно опустить, так как она уже указана в базовом классе?
> Если можно, укажите, где это можно прочесть?
Подозреваю, что обязательно.
← →
harisma (2008-10-23 12:32) [2]>To Palladin
За ответ на первых 2 вопроса спасибо.
По третьему вопросу позволь не согласиться, так как программа вполне корректно работает без указания директивы safecall в порожденном классе, но мне хотелось бы быть точно уверенным в этом.
Жду ответа на мой третий вопрос от знатоков в этой области.
Заранее спасибо.
← →
Palladin © (2008-10-23 13:08) [3]
> так как программа вполне корректно работает без указания
> директивы 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 13:24) [4]Так я писал в сути задачи:
> 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:46) [5]ах вот оно как... если в базовом уже указано, то необязательно... соглашение о вызове так же наследуется.
← →
harisma (2008-10-23 14:00) [6]
> если в базовом уже указано, то необязательно
Отлично. Спасибо!!! :)
Тема закрыта.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2009.11.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c