Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как у класса наследника явным образом показать методы родителя


Gedevan ©   (2015-09-24 22:39:00) 

В общем я плохо могу формулировать вопрос,но.

Есть программа Rem Object Pascal Script и в ней есть импортер классов, который собственно делает класс доступным из скрипта. Но у него есть беда, в том что он старый и особенностей XE да и вообще многих моментов в синтаксисе типовых модулей переварить не может.

Поэтому я делаю класс обертку вокруг существующего класса, но чтобы методы родителя были доступны из скрипта их нужно показать в классе обертке. Так вот вопрос как их с одной стороны показать, а с другой не переопределять их в наследнике.

Например, насколько я понял для свойств просто пишем

public
  property AsText;
  property FormatCount;
  property Formats;

а методы и процедуры как?


Юрий Зотов   (2015-10-03 20:48:00) [1]

LOL. Последние 2 строчки не читать, я из просто забыл удалить. Sorry.


Юрий Зотов   (2015-10-03 20:46:00) [2]

> Gedevan
> а в чем разница?


Говоря об обертке обычно имеют в виду агрегирование, а не наследование.

type
 
 TClass1 = class(...)
 ...
 end;

 TClass2 = class(TClass1) // Это наследник от TClass1
 ...
 end;

 TClass3 = class(...) // Это обертка вокруг TClass1
 private
   FClass1: TClass1;  // Агрегирование TClass1 в обертку TClass3
 ...
 end;


> это не перенос из protected, это "перенос" из public в public

То есть, импортер код видит (раз этот код уже в public), но не понимает, вынуждая Вас его "упрощать" (кстати - не понимаю, как можно упростить код Clipboard).

Если так, то корень зла в том, что это плохой импортер. И если зрить в корень, то не поискать ли замену?

Тогда

Но если импортер не понимает еода из public


Gedevan   (2015-10-03 15:14:00) [3]

ну и потом, если я их распишу точно также как в родителе, то получу те же самые ошибки при импорте, т.е. смысла в этом нет ) поэтому  я пытался вызывать из них методы родителя, что опять же не очень у меня вышло. Но в итоге удалось просто удалить все  непонятные моменты из кода родителя и все заработало )


Gedevan   (2015-10-03 15:10:00) [4]


> Так Вы делаете наследника, или обертку? Лучше покажите на
> примере.


а в чем разница?

я пишу так
 TClipBrd = Class(TClipboard)
 private
   function GetAsText: string;
   function GetFormatCount: Integer;
   function GetFormats(Index: Integer): Word;
   procedure SetAsText(const Value: string);
 public
   Constructor Create();
   destructor Destroy;
   procedure Assign(Source: TPersistent);
   procedure Clear;
   procedure Close;
   function GetComponent(Owner, Parent: TComponent): TComponent;
   function GetAsHandle(Format: Word): THandle;
   function HasFormat(Format: Word): Boolean;
   procedure Open; virtual;
   procedure SetComponent(Component: TComponent);
   procedure SetAsHandle(Format: Word; Value: THandle);
   function GetTextBuf(Buffer: PChar; BufSize: Integer): Integer;
   procedure SetTextBuf(Buffer: PChar);
   property AsText: string read GetAsText write SetAsText;
   property FormatCount: Integer read GetFormatCount;
   property Formats[Index: Integer]: Word read GetFormats;
 End;


но я не хочу эти методы в Implementation расписывать, а если их в коде не будет вообще, то импортер их не зарегистрирует и работать они не будут в скрипте.


Gedevan   (2015-10-03 15:07:00) [5]

Я хотел избежать того, что если я в теле класса пишу procedure Useful(param1,param2:integer); то мне придется потом в разделе implementation также определять эту функцию и писать все ее содержимое. Т.е. я получу кучу писанины, несмотря на то, что родительская функция меня более чем устраивает.

Проблема не в моем отношении к классу, а в том, что программа которая их импортирует не понимает того кода которым они написаны и поэтому код надо упростить.

это не перенос из protected, это "перенос" из public в public

в текущем случае я просто переписал класс родитель, удалив из него все что вызывало вопли со стороны программы импортера. Но так совсем не всегда получается.


icWasya   (2015-09-29 17:17:00) [6]

То есть всё равно нужно писать функцию-обёртку и надеяться, что оптимизатор её выбросит. Чего автор топика, видимо, хотел избежать.


Юрий Зотов   (2015-09-29 10:34:00) [7]


Для private - без хакерских штучек никак А для protected - можно. Вот примеры из блога GunSmoker'а.

unit Utility;

interface

type
 TUtility = class // Предок
 protected
   procedure Useful;
 end;

// ====== Способ 1 - рекомендую

type
 TMyUtility = class(TUtility) // Потомок с другим именем класса
 public
   procedure Useful;
 end;

procedure TMyUtility.Useful;
begin
 inherited Useful;
end;

// ====== Способ 2 - не рекомендую
// ====== При использовании в uses писать MyUtility, а не Utility

unit MyUtility;

interface

uses
 Utility;

type
 TUtility = class(Utility.TUtility) // Потомок с тем же именем класса
 public
   procedure Useful;
 end;


icWasya   (2015-09-29 08:57:00) [8]

Короче, человеку надо следующее.

Есть родительский класс. У него есть protectedсвойства и методы.
Как малой кровью в классе-наследнике сделать их public.
Для свойств есть синтаксическая фича, как написано в топике. А для методов?


Юрий Зотов   (2015-09-27 21:12:00) [9]

Так Вы делаете наследника, или обертку? Лучше покажите на примере.


Наверх

Титульная страница Поиск, карта сайта Написать письмо