Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Методы класса или поля 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)

> Во-первых, постоянно надо использовать "^"

Зачем?


Наверх

Титульная страница Поиск, карта сайта Написать письмо