Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
ВнизМетоды класса или поля record а? Найти похожие ветки
← →
HydraMarat (2005-02-18 14:44) [0]Вопрос почти флеймовый. Есть необходимость организовать массив, элементы которого имеют набор процедур, ну примерно как TMemoryManager. Так вот я это сделал record"ом, но там возникают всякие неудобства. Во-первых, постоянно надо использовать "^", а во-вторых неудобно сравнивать идентификаторы таких record"ов (набо использовать "@"). Так вот я подумал, может это выразить в виде классов, содержащих только методы класса? Как вы считаете? Или это коряво? Вопрос скорее организационного плана. Как все-таки принято?
Спасибо.
← →
begin...end © (2005-02-18 14:46) [1]> HydraMarat (18.02.05 14:44)
> Во-первых, постоянно надо использовать "^"
Зачем?
← →
HydraMarat (2005-02-18 14:51) [2]Потому как сам массив возвращает указатели на соответствующие record"ы... для скорости.
← →
begin...end © (2005-02-18 14:52) [3]> HydraMarat (18.02.05 14:51) [2]
Если он возвращает типизированные указатели на record"ы, то ^ можно не использовать.
← →
Digitman © (2005-02-18 14:54) [4]
> HydraMarat (18.02.05 14:51) [2]
> Потому как сам массив возвращает указатели на соответствующие
> record"ы... для скорости.
что-то ты загнул ... явно малосуразное ... по кр.мере - навскидку ..
не сподобишься ли проиллюстрировать в коде ?
← →
HydraMarat (2005-02-18 14:58) [5]Не понял. Есть класс, который имеем индексированное свойство, которое возврщает эти самые record"ы. Сами record"ы - куча констант, которые класс и вуалирует в виде массива. Непосредственно record"ы "видит" только класс, другие работают со свойством. Так разве я не теряю в скорости, если буду возвращать значение, а не указатель? (в функции read у свойства)
← →
HydraMarat (2005-02-18 15:05) [6]примерный код:
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 15:08) [7]Ну у Rec2 в GetItem тоже естессно "собачка"...
← →
begin...end © (2005-02-18 15:11) [8]> HydraMarat (18.02.05 15:05) [6]
Повторяю: при обращении к записи значок "^" можно убрать. Cl.Items[0]^.Proc --> Cl.Items[0].Proc.
← →
HydraMarat (2005-02-18 15:18) [9]Ах да, я немного не о том подумал... такое разрешит, но все же... Сравнивать идентификаторы придется-то только @Rec1 = @Rec2. Конечно я этого не проверяю, но одним из параметров процедуры в record"е идет указатель на другой record. Так вот проверить какая это из констант можно только через "собачку" так? А может PRec Заменить на class of, а record заменить на class, а поля на методы класса? Меня здесь смущает использование классов без объектов, кажется корявым? Например, TMemoryManager и TVariantManager сделаны именно record"ами...
← →
HydraMarat (2005-02-18 15:32) [10]Ну че? Еще мнения будут?
← →
Sapersky (2005-02-18 16:08) [11]Заменить на class of, а record заменить на class, а поля на методы класса?
Сомневаюсь, что класс выдержит такое издевательство... разве что object ( TRec = object, "старопаскалевский" объект). Их можно считать "записями с методами" и обращаться соответственно.
Но это в том случае, если процедуры не изменяются программно - такого никакой объект не позволит с собой делать, ИМХО.
Cl.Items[0]^.Proc --> Cl.Items[0].Proc
А если указать свойству default, то ещё проще: Cl[0].Proc
← →
HydraMarat (2005-02-18 17:49) [12]Ну я уж образно выразился! В-общем перевел все на классы, так мне гораздо проще. Уж больно часто приходится сравнивать идентификаторы и реализовывать множество однотипной логики. Я уже отвык это делать простыми процедурками (заколебываюсь искать что?где?как?), да все нужно с директивой forward (знаю, что можно избежать, но это опять же гемор). Так что всё теперь на классах.
Всем спасибо.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 2.438 c