Форум: "Прочее";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
ВнизКласс Helper Найти похожие ветки
← →
кукуруку (2006-10-31 21:37) [0]Что прячется за такиой формулировкой "Класс Helper", дя чего это нужно? Ответ можно ссылкой, я что-то ничего хорошего не нашел.
← →
@!!ex © (2006-10-31 21:40) [1]Helper"ы - группа людей, призванных помогать нубам.
А откуда вопрос?
Последний раз я о хелперах в МАДе слышал....
← →
Eraser © (2006-10-31 21:44) [2]> [0] кукуруку (31.10.06 21:37)
About Class Helpers
A class helper is a type that - when associated with another class - introduces additional method names and properties which may be used in the context of the associated class (or its descendants). Class helpers are a way to extend a class without using inheritance. A class helper simply introduces a wider scope for the compiler to use when resolving identifiers. When you declare a class helper, you state the helper name, and the name of the class you are going to extend with the helper. You can use the class helper any place where you can legally use the extended class. The compiler"s resolution scope then becomes the original class, plus the class helper.
Class helpers provide a way to extend a class, but they should not be viewed as a design tool to be used when developing new code. They should be used solely for their intended purpose, which is language and platform RTL binding.
Class Helper Syntax
The syntax for declaring a class helper is:type
identifierName = class helper [(ancestor list)] for classTypeIdentifierName
memberList
end;
The ancestor list is optional.
A class helper type may not declare instance data, but class fields are allowed.
The visibility scope rules and memberList syntax are identical to that of ordinary class types.
You can define and associate multiple class helpers with a single class type. However, only zero or one class helper applies in any specific location in source code. The class helper defined in the nearest scope will apply. Class helper scope is determined in the normal Delphi fashion (i.e. right to left in the unit"s uses clause).
Using Class Helpers
The following code demonstrates the declaration of a class helper:type
TMyClass = class
procedure MyProc;
function MyFunc: Integer;
end;
...
procedure TMyClass.MyProc;
var X: Integer;
begin
X := MyFunc;
end;
function TMyClass.MyFunc: Integer;
begin
...
end;
...
type
TMyClassHelper = class helper for TMyClass
procedure HelloWorld;
function MyFunc: Integer;
end;
...
procedure TMyClassHelper.HelloWorld;
begin
writeln(Self.ClassName); // Self refers to TMyClass type, not TMyClassHelper
end;
function TMyClassHelper.MyFunc: Integer;
begin
...
end;
...
var
X: TMyClass;
begin
X := TMyClass.Create;
X.MyProc; // Calls TMyClass.MyProc
X.HelloWorld; // Calls TMyClassHelper.HelloWorld
X.MyFunc; // Calls TMyClassHelper.MyFunc
Note that the class helper function MyFunc is called, since the class helper takes precedence over the actual class type.
← →
jack128(not home) (2006-10-31 21:49) [3]не, вещь прикольная. по крайней мере у мя терь код выглядит так:
var
Stream: TStream;
I: Integer;
b: byte;
s: string;
begin
...
b := Stream.ReadByte;
s := Stream.ReadString;
...
Stream.WriteInt32(I);
end;
что весьма сильно повышает читабельность...
← →
Ketmar © (2006-10-31 21:57) [4]>[3] jack128(not home) 31-Oct-2006, 21:49
>что весьма сильно повышает читабельность...
если б оно ещё в D7 компилялось...
← →
jack128(not home) (2006-10-31 22:11) [5]
> если б оно ещё в D7 компилялось...
а у нас в конторе все на 10ке сидят, так что... ;-)
и потом - есть турбо, что те еще надо???
← →
Ketmar © (2006-10-31 22:19) [6]>[5] jack128(not home) 31-Oct-2006, 22:11
>и потом - есть турбо, что те еще надо???
сам это удолбище ставь. вместе с дотнетом и отсутствием dcc32.exe. %-)
← →
Суслик © (2006-10-31 22:53) [7]
> сам это удолбище ставь. вместе с дотнетом и отсутствием
> dcc32.exe. %-)
dcc32.exe был вроде выкачен для turbo prof (т.е. для платной версии).
← →
Ketmar © (2006-10-31 22:55) [8]>[7] Суслик(c) 31-Oct-2006, 22:53
>dcc32.exe был вроде выкачен для turbo prof (т.е. для
>платной версии).
да пофигу. D10Lite всё равно удобней -- ибо не требует дотнета. %-)
← →
iZEN © (2006-10-31 23:09) [9]Хелперы чертовски похожи на миксины. Может это они и есть?
← →
Суслик © (2006-11-01 00:58) [10]скажу честно, я не просек выгоды от хелперов.
я критически просмотрел все добавки в delph10:
1. перегрузка операторов - гуд.
2. вложенные классы - гуд (если ошибки исправят)
3. записи с методами - гуд (аналогично)
4. for in - гуд
а вот хелперам не нашел применение :(
← →
Eraser © (2006-11-01 01:04) [11]> [10] Суслик © (01.11.06 00:58)
применение для хэлперов хоть и сложно найти, зато вполне может возникнуть случай, что при рефакторинге они сильно облегчат жизнь.
← →
Суслик © (2006-11-01 01:06) [12]
> Eraser © (01.11.06 01:04) [11]
Да я не спорю...
дельфи вообще в последнее время так развивается, появляется много новых возможностей, которые и осознать то не просто бывает.
← →
iZEN © (2006-11-01 03:18) [13]
> Суслик © (01.11.06 00:58) [10]
>
> скажу честно, я не просек выгоды от хелперов.
>
> а вот хелперам не нашел применение :(
Ну это, например, когда определён интерфейс и у него общую функциональность можно реализовать прям на месте в нём же, а не каждый раз в реализации.
Так как множественное наследование запрещено, то миксины являются хорошим способом обойти наследование и сделать код более понятным, без трудных для понимания неоднозначностей. (хотя неоднозначности могут возникнуть)
← →
jack128(not home) (2006-11-01 07:45) [14]
> а вот хелперам не нашел применение :(
см [3]
конечно можно было бы написать
b := ReadByteFromStream(Stream);
s := ReadStringFromStream(Stream);
WriteInt32ToStream(Stream) , но [3] явно нагляднее выглядит..
> Ну это, например, когда определён интерфейс и у него общую
> функциональность можно реализовать прям на месте в нём же,
> а не каждый раз в реализации.
не, этого хелперы не могут. хелперы всего помогают добавить невиртуальный метод в любой класс,даже если ты не можешь менять исходники этого класса.
← →
Aldor © (2006-11-01 08:26) [15]
> jack128(not home) (01.11.06 07:45) [14]
> не, этого хелперы не могут. хелперы всего помогают добавить
> невиртуальный метод в любой класс,даже если ты не можешь
> менять исходники этого класса.
А смысл? От наследования чем отличается, простите за неграмотность (про хелперы в первый раз в этой ветке услышал, пока на D7 :) )
← →
Наиль © (2006-11-01 09:00) [16]> если б оно ещё в D7 компилялось...
Марк Кэнту (Канту, Кенту) в своей книге (которой нет сейчас под рукой) "Delphi 7 для профессионалов" полностью описывает прицип действия хелперов, а также объясняет причины их появления. Типа, реализация методов объекта, которые обязаны быть у объекта в ДотНет, но реализованы в ObjectPascal. За цитирование не ручаюсь, но код из [3] в D7 скомпилируется нормально, если создать соотвествующий хелпер к TStream.
← →
Наиль © (2006-11-01 09:01) [17]> но реализованы в ObjectPascal
но не реализованы в ObjectPascal
← →
Наиль © (2006-11-01 09:17) [18]Ох и поспешил же с [16].
Начитался умных книжек и вот результат.
Проверил свои слова, а они оказались не правдой.
Теперь начинаю припоминать, что Хелперы были в главе про дополнение к D7, которое (дополнение) предназначено для работы с ДотНет.
Раз книга о D7, то естественно, я обобщил знания о хелперах на стандартную версию.
← →
jack128 © (2006-11-01 10:15) [19]Aldor © (01.11.06 8:26) [15]
От наследования чем отличается, простите за неграмотность
ну попробуй реализовать [3] с помощью наследования - увидешь..
← →
icWasya © (2006-11-01 10:36) [20]Например
type
TMyCanvas = class helper for TCanvas
procedure DrawGreeLine(x1,y1,x2,y2:Integer);
end;
procedure TMyCanvas. DrawGreeLine(x1,y1,x2,y2:Integer);
begin
MoveTo(x1,y1);
Pen.Color:=clGreen;
LineTo(x2,y2);
end;
..
Im1ge1.Canvas.DrawGreeLine(100,100,200,200);
← →
oxffff © (2006-11-01 10:40) [21]jack128(not home) (01.11.06 07:45) [14]
хелперы всего помогают добавить невиртуальный метод в любой класс
Объявить виртуальный метод class helper позволяет.
Правда трубует добавить еще QueryInterface,_AddRef: Integer,_Release.
Вот вызов виртуального метода у класс Helper.
lea ecx,[ebp-$04] //Результат от GetHelperIntf
mov edx,[$....] //Tclass
mov eax,ebx //Instance
call @getHelperintF
mov eax,[ebp-$04] //Обращение
mov edx,[eax] //по
call dword ptr [edx+$0c] //интерфейсу
ОЧень интересный подход, то есть тут из Borland хотят запихать VTB Helper class, в таблицу интерфейса. То есть
Obj1HelperClassinterface=interface
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
// Далее идут виртуальне методы
end;
Только вот реализация GetHelperIntf.
function _GetHelperIntf(Instance: TObject; Cls: TClass): IInterface;
begin
Result := nil;
end;
Это заглушка.
То есть возможно сделано на будущее.
Ваши соображения
← →
jack128 © (2006-11-01 10:51) [22]oxffff © (01.11.06 10:40) [21]
Это заглушка.
естественно. Поэтому вызов виртуального метода даст AV...
oxffff © (01.11.06 10:40) [21]
Ваши соображения а какие тут могут быть соображения? Ну хотели реализовать, но не успели.. Или отказались вообще от этой идеи.. Да мало ли причин...
← →
oxffff © (2006-11-01 11:20) [23]
> jack128 © (01.11.06 10:51) [22]
> oxffff © (01.11.06 10:40) [21]
> Это заглушка.
> естественно. Поэтому вызов виртуального метода даст AV..
> .
>
> oxffff © (01.11.06 10:40) [21]
> Ваши соображения а какие тут могут быть соображения? Ну
> хотели реализовать, но не успели.. Или отказались вообще
> от этой идеи.. Да мало ли причин...
Ты бы стал добавлять функциональность, которая всегда приводит к AV.
Чтобы сделали с твоей программой.
Запретить объявления виртульных методов в class helper могли сделать.
Но не сделали. Ведь позволяют объявить. Значит не просто так.
Не надо их считать неграмотными.
← →
oxffff © (2006-11-01 11:34) [24]А еще есть TClassHelperBase
← →
jack128 © (2006-11-01 11:44) [25]oxffff © (01.11.06 11:20) [23]
Запретить объявления виртульных методов в class helper могли сделать.
зайди на qc и посмотри сколько всего не запретили делать, что в результате приводит к ошибкам компилятора..
← →
euru © (2006-11-01 12:29) [26]Года два назад (тогда ещё старая кладовка работала) я выкладывал код, в котором был реализован механизм, позволяющий добавлять методы к уже существующим классам в D7. Правда, было два недостатка:
1. Все классы, к которым можно было добавлять методы, должны быть только потомками некоторого корневого класса.
2. Так как в D7 не предусмотрена поддержка такой возможности, то код выглядел несколько громоздким.
Зато в моём варианте методы можно было добавлять не только классам, но и отдельным объектам.
← →
Игорь Шевченко © (2006-11-01 12:29) [27]И все-таки это неправильно. Как костыль вполне можно применять, но как самостоятельное средство - мне кажется странным и лишним.
← →
jack128 © (2006-11-01 12:36) [28]Игорь Шевченко © (01.11.06 12:29) [27]
Как костыль вполне можно применять,
а почему Stream.WriteString(S) - это костыль, а WriteStringToStream(Stream, S) - нет?
← →
Игорь Шевченко © (2006-11-01 12:47) [29]jack128 © (01.11.06 12:36) [28]
Потому что по Stream справка есть
← →
oxffff © (2006-11-01 12:50) [30]Долой class helper.
← →
TUser © (2006-11-01 13:08) [31]Чего то не нашел я в семерке этих хелперов. Плохо искал?
← →
jack128 © (2006-11-01 13:58) [32]TUser © (01.11.06 13:08) [31]
Чего то не нашел я в семерке этих хелперов.
нету их там.
← →
Наиль © (2006-11-01 14:24) [33]
> [31] TUser © (01.11.06 13:08)
> Чего то не нашел я в семерке этих хелперов. Плохо искал?
см. [18]
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.055 c