Форум: "Начинающим";
Текущий архив: 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