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

Вниз

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

 
Gedevan   (2015-09-24 22:39) [0]

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

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

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

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

public
  property AsText;
  property FormatCount;
  property Formats;

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


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

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


 
icWasya ©   (2015-09-29 08:57) [2]

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

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


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


Для 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 17:17) [4]

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


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

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

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

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

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


 
Gedevan   (2015-10-03 15:10) [6]


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


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

я пишу так
 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:14) [7]

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


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

> 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


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

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



Страницы: 1 вся ветка

Текущий архив: 2017.06.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.004 c
15-1462732945
Inovet
2016-05-08 21:42
2017.06.11
Вот и 9 Мая!


1-1350803047
Verner
2012-10-21 11:04
2017.06.11
Способ хранения объектов в памяти


2-1443123555
Gedevan
2015-09-24 22:39
2017.06.11
Как у класса наследника явным образом показать методы родителя


2-1443631313
Валя
2015-09-30 19:41
2017.06.11
доступ до БД Oracle


4-1282335043
sfary
2010-08-21 00:10
2017.06.11
Ловушка на запуск файлов. Hook на CreateProcess