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

Вниз

Наследование и интерфейсы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
15-1252149563
Пит
2009-09-05 15:19
2009.11.15
Правка заголовков модулей в ВАП


15-1251884197
Piter
2009-09-02 13:36
2009.11.15
Размер дистрибутива .NET


2-1254420825
Drowsy
2009-10-01 22:13
2009.11.15
Текстовый файл и пустые строки.


2-1254568749
faiwer
2009-10-03 15:19
2009.11.15
Как реализовать?


15-1253017968
stas
2009-09-15 16:32
2009.11.15
Vista -запустить программу с правами админа