Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.06.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





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


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


15-1463088604
Юрий
2016-05-13 00:30
2017.06.11
С днем рождения ! 13 мая 2016 пятница


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


2-1443529753
alvlts1
2015-09-29 15:29
2017.06.11
Вопрос про точки останова.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский