![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте, уважаемые форумчане.
Опишу задачу: есть несколько массивов разных типов, например, массив строк и массив целых чисел Код:
var integerArray: array of integer; stringArray: array of string; есть общие функции для работы с ними: задать размер массива, добавить новый элемент в массив, удалить элемент массива, отобразить все элементы массива и т.д. сейчас я это делаю очень тупо: Код:
procedure setLengthArray(arrayName:string, len:integer); begin if arrayName='integerArray' then setlength(integerArray,len); if arrayName='stringArray' then setlength(stringArray,len); end; procedure deleteFirst(arrayName:string); begin if arrayName='integerArray' then delete(integerArray[0]); if arrayName='stringArray' then delete(stringArray[0])); end В общем, если массивов не два а двадцать, код растягивается неимоверно. Обратите внимание, что операции с массивом однотипные и повторяются копипастом... т.е. Вопрос такой: как обратиться к массиву, зная его имя... например, передать имя массива в функцию, в которой можно будет делать однотипные операции... возможно, есть и альтернативные подходы... Надеюсь на помощь. ![]() |
#2
|
||||
|
||||
![]() Используй array of variant. Тогда можноо вообще только один массив иметь, анализировать через VarType.
А лучше коллекции использовать. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
![]() а зачем вообще так делать (про setLengthArray и deleteFirst)?
Пишу программы за еду. __________________ |
#4
|
|||
|
|||
![]() 2 NumLock так делать незачем, это абстрактные примеры, иллюстрирующие мое незнание...
2 M.A.D.M.A.N. поподробнее, пожалуйста, лучше с кодом... ![]() |
#5
|
|||
|
|||
![]() по поводу varType он только стандартные типы определяет?
Цитата:
Это не совсем то, что нужно... В примерах я говорил о типах целое и строка для простоты, на самом деле у меня описаны классы объектов. Массивы типа: массив стульев, массив столов и т.д. массивы объектов... такой подход с variant прокатит? |
#6
|
||||
|
||||
![]() У тебя там будут экземпляры классов? В принципе array of TObject пойдет.
А вообще, для хранения классов есть листики спецовые, TObjectList называется. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#7
|
|||
|
|||
![]() 2 M.A.D.M.A.N. TObjectList кажется то, что нужно...
можно все экземпляры классов засунуть в один список, через свойство list.Items[i].ClassType.ClassName определять их тип... буду много думать... ![]() |
#8
|
||||
|
||||
![]() ClassName - это класс функция, она может быть вызвана как с объекта, так и с класса, не обязательно делать так: "ClassType.ClassName".
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#9
|
|||
|
|||
![]() да, действительно можно короче писать
list[i].ClassName спасибо ![]() |
#10
|
|||
|
|||
![]() В продолжение темы возник вопрос...
Допустим, у меня есть класс TParent с какими-то общими свойствами и методами и есть куча классов потомков типа TChild1,TChild2,..,TChild20 Код:
type TParent = class parentProperty:string; procedure initParent; end; type TChild1 = class(TParent) child1Property:string; procedure initChild; end; type TChild2 = class(TParent) child2Property:string; procedure initChild; end; //..... type TChild20 = class(TParent) child20Property:string; procedure initChild; end; допустим, есть ObjectList в который я добавил все экземпляры дочерних классов. теперь я обращаюсь к i-му элементу ObjectList Код:
var Obj:TParent; //... Obj:=ObjectList[i]; //я могу легко вызвать метод parentInit; Obj.parentInit; //но, чтобы вызвать метод childInit, мне уже приходиться делать тупо if Obj.className='TChild1' then (Obj as TChild1).initChild; if Obj.className='TChild2' then (Obj as TChild2).initChild; //... if Obj.className='TChild20' then (Obj as TChild20).initChild; Вопрос: как это делать красивее? |
#11
|
||||
|
||||
![]() Код:
if Obj.InheritsFrom(TChild) then TChild(Obj).initChild; — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#12
|
|||
|
|||
![]() все TChild1, TChild2... TChild20 являются потомками TParent.
Метод TParent.parentInit является для них общим, с ним проблем нет. а вот методы TChild1.childInit, TChild2.childInit, ... являются методами инициализации потомков и описаны в них, причем у каждого потомка своя реализация этого метода, они только называются одинаково... вот и вопрос, я вытащил непонятно что из ObjectList, как мне вызвать метод childInit, от любого потомка... чтобы не перебирать TChild1(Obj).initChild TChild2(Obj).initChild ... TChild20(Obj).initChild как-нибудь так (любой потомок TParent).initChild; может я много хочу ![]() |
#13
|
||||
|
||||
![]() Читай про методы, объявленные как virtual и abstract. То, что тебе нужно.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#14
|
|||
|
|||
![]() ![]() ![]() |