![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Методы класса или поля record'а? [D7, WinXP]
HydraMarat © (2005-02-18 14:44:00)Вопрос почти флеймовый. Есть необходимость организовать массив, элементы которого имеют набор процедур, ну примерно как TMemoryManager. Так вот я это сделал record'ом, но там возникают всякие неудобства. Во-первых, постоянно надо использовать "^", а во-вторых неудобно сравнивать идентификаторы таких record'ов (набо использовать "@"). Так вот я подумал, может это выразить в виде классов, содержащих только методы класса? Как вы считаете? Или это коряво? Вопрос скорее организационного плана. Как все-таки принято?
Спасибо.
HydraMarat (2005-02-18 17:49:00) [1]Ну я уж образно выразился! В-общем перевел все на классы, так мне гораздо проще. Уж больно часто приходится сравнивать идентификаторы и реализовывать множество однотипной логики. Я уже отвык это делать простыми процедурками (заколебываюсь искать что?где?как?), да все нужно с директивой forward (знаю, что можно избежать, но это опять же гемор). Так что всё теперь на классах.
Всем спасибо.
Sapersky (2005-02-18 16:08:00) [2]Заменить на class of, а record заменить на class, а поля на методы класса?
Сомневаюсь, что класс выдержит такое издевательство... разве что object ( TRec = object, "старопаскалевский" объект). Их можно считать "записями с методами" и обращаться соответственно.
Но это в том случае, если процедуры не изменяются программно - такого никакой объект не позволит с собой делать, ИМХО.
Cl.Items[0]^.Proc --> Cl.Items[0].Proc
А если указать свойству default, то ещё проще: Cl[0].Proc
HydraMarat (2005-02-18 15:32:00) [3]Ну че? Еще мнения будут?
HydraMarat (2005-02-18 15:18:00) [4]Ах да, я немного не о том подумал... такое разрешит, но все же... Сравнивать идентификаторы придется-то только @Rec1 = @Rec2. Конечно я этого не проверяю, но одним из параметров процедуры в record'е идет указатель на другой record. Так вот проверить какая это из констант можно только через "собачку" так? А может PRec Заменить на class of, а record заменить на class, а поля на методы класса? Меня здесь смущает использование классов без объектов, кажется корявым? Например, TMemoryManager и TVariantManager сделаны именно record'ами...
begin...end (2005-02-18 15:11:00) [5]> HydraMarat (18.02.05 15:05) [6]
Повторяю: при обращении к записи значок "^" можно убрать. Cl.Items[0]^.Proc --> Cl.Items[0].Proc.
HydraMarat (2005-02-18 15:08:00) [6]Ну у Rec2 в GetItem тоже естессно "собачка"...
HydraMarat (2005-02-18 15:05:00) [7]примерный код:
interface
...
type
PRec = ^TRec;
TRec = record
Proc: procedure;
Func: function: Integer;
end;
TCl = class(TObject)
private
...
function GetItem(Index: Integer): PRec;
...
public
...
property Items[Index: Integer]: PRec read GetItem;
...
end;
...
implementation
...
const
Rec1: TRec = (Proc: Pr1; Func: Fn1);
Rec2: TRec = (Proc: Pr2; Func: Fn2);
у функции вид убожеский, но это только для примера, на самом деле она не такая "тупая"
function TCl.GetItem(Index: Integer): PRec;
begin
if Index = 0 then
Result := @Rec1
else if Index = 1 then
Result := Rec2
else
raise ЛяЛяЛя...
end;
Ну примерно так... Внешние модули соответственно юзают так:
var
Cl: TCl;
begin
...
Cl.Items[0]^.Proc;
...
end;
Так вот, может чтоб с константами не мудится лучше все классами представить? По скорости по ходу все-равно ничего не потеряю, но вот ^ и @ не нужны будут...
HydraMarat (2005-02-18 14:58:00) [8]Не понял. Есть класс, который имеем индексированное свойство, которое возврщает эти самые record'ы. Сами record'ы - куча констант, которые класс и вуалирует в виде массива. Непосредственно record'ы "видит" только класс, другие работают со свойством. Так разве я не теряю в скорости, если буду возвращать значение, а не указатель? (в функции read у свойства)
Digitman (2005-02-18 14:54:00) [9]
> HydraMarat (18.02.05 14:51) [2]
> Потому как сам массив возвращает указатели на соответствующие
> record'ы... для скорости.
что-то ты загнул ... явно малосуразное ... по кр.мере - навскидку ..
не сподобишься ли проиллюстрировать в коде ?
begin...end (2005-02-18 14:52:00) [10]> HydraMarat (18.02.05 14:51) [2]
Если он возвращает типизированные указатели на record'ы, то ^ можно не использовать.
HydraMarat (2005-02-18 14:51:00) [11]Потому как сам массив возвращает указатели на соответствующие record'ы... для скорости.
begin...end (2005-02-18 14:46:00) [12]> HydraMarat (18.02.05 14:44)
> Во-первых, постоянно надо использовать "^"
Зачем?