Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];

Вниз

Class   Найти похожие ветки 

 
TBeginner   (2002-08-21 14:20) [0]

Пусть требуется создать несколько классов-списков для хранения данных типа Integer, String, и, допустим, данных типа какая-нибудь запись TMyRecord, не используя при этом TList, TStringList и т. п. (не спрашивайте, почему - это вопрос чисто теоретический). Как это получше сделать - через наследование классов, или же описывать каждый класс полностью отдельно?
Например, для TIntList (с минимумом необходимых свойств):
TIntList = class
private
FItems : array of Integer;
FCount, FDelta, FCapacity : Integer;
function Get (Index : Integer) : Integer;
public
constructor Create (Delta : Integer);
destructor Destroy; override;
procedure Add (Item : Integer);
procedure Delete (Index : Integer);
procedure Pack;
function FindFirst (Value : Integer) : Integer;
property Items [Index : Integer] : Integer read Get;
property Count : Integer read FCount;
end;

Теперь, для списка TMyRecordList нужно делать FItems : array of TMyRecord, а ещё procedure Add (Item : TMyRecord), а ещё function FindFirst (Value : TMyRecord) и т. д., т.е. получается - всё переписывать заново? Или можно вначале определить какой-нибудь класс-родитель? Посоветуйте что-нибудь, только не ругайтесь сильно - я вообще-то не очень в этом пока разбираюсь...


 
Ученик   (2002-08-21 14:25) [1]

Похоже на Source\Decision Cube\Mxarrays.pas


 
Skier   (2002-08-21 14:28) [2]

>TBeginner
Если я правильно тебя понял, то
можно сделать общий список для твоих данных
TCommonList = class;
где каждый элемент будет иметь следующий вид :

TCommonRec = packed record
crDataType : Byte; //тип данных
crData : Pointer; //указатель на данные...
end; //TCommonRec
PCommonRec = ^TCommonRec;


 
Digitman   (2002-08-21 14:37) [3]

Более правильно (концептуально), эффективно, просто и изящно, конечно же, будет создание базового класса, имеющего некий набор виртуальных абстрактных методов управления списком.

Другой вопрос, что списки, которые будут управляться наследниками такого класса, должны иметь разнородные структуры. Но и это решаемо (хотя и не очень удобно)


 
kull   (2002-08-21 14:50) [4]

Можно сделать общий список для всех типов данных. И в его конструктор передавать класс элемента данных.

Ну типа:

type

TMyElement = class
end;

TMyElementClass = class of TMyElement;

TMyList = class
...
public
constructor Create(const MyElementClass: TMyElementClass);
end;


TMyRecordElem = class(TMyElement)
end;

.....
begin
TMyList.Create(TMyRecordElem);
...

хотя все это ненужная замена TList.


 
Skier   (2002-08-21 14:55) [5]

>kull
Я думаю, что если он будет хранить в списке (Integer),
то класс для этого (TMyRecordElem) - это слишком...


 
kull   (2002-08-21 15:22) [6]


> Skier © (21.08.02 14:55)

Это смотря что нужно?
Если критична скорость работы, количество съедаемой памяти, или просто надо на скору руку склепать приложенице то слишком.

А если нужна универсальность, гибкость, и оперирование с данными заранее неизвестного типа, то - это то что надо.


 
AlexSV   (2002-08-21 15:32) [7]

А если в качестве базового взять простой TList?
Все построено на pointer"ах, поэтому и храни хоть
integer, хоть record.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
3-3269
pave1
2002-08-12 13:42
2002.09.02
Delphi + MySql


4-3669
Ocean
2002-07-02 10:25
2002.09.02
Minimize CreateProcess window


3-3248
Dino Ray
2002-08-12 01:03
2002.09.02
IDX поля типа CHAR?


1-3473
Tokha
2002-08-21 08:58
2002.09.02
Как


8-3530
mari_ra
2002-04-24 18:23
2002.09.02
Как вывести BMP на панель?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский