Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1253017968
stas
2009-09-15 16:32
2009.11.15
Vista -запустить программу с правами админа


2-1254374207
Necco
2009-10-01 09:16
2009.11.15
StringList в Edit


1-1224027173
3she1on
2008-10-15 03:32
2009.11.15
embedded null ветка реестра


2-1254304088
Venus
2009-09-30 13:48
2009.11.15
Отправка е-маил (рассылка)


8-1198845410
hero
2007-12-28 15:36
2009.11.15
снять звук с аудио ин или аут, где найти TdeAudioIn или подобное





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский