The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"хранение объектов различных классов в массиве"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"хранение объектов различных классов в массиве"  
Сообщение от cybersun email on 19-Мрт-06, 01:19 
Приветствую, коллеги!
Уже несколько дней бьюсь над проблемой обозначенной в теме. Конкретно меня интересует вопрос обработки всего этого хозяйства! Объекты разные, а значит не избежать преобразования типов, без которого доступ к объекту не предоставляется. Вопрос: необходимо выполнять различные действия над объектами - изменение параметров, сравнивание и т.д. Есть ли алгоритмы, которые позволяют это грамотно реализовать в C\C++\C#? Вопросов небыло бы, если бы объектов было бы мало 2-3, а если их туча?... Хранение объектов одного типа в массиве только этого типа - это хорошо, а вот как тогда реализовать те же самые операции с массивами других объектов? Не нравится мне дублировать огромные куски кода... Вот и прошу у вас помощи... Любые идеи и предложения приветствуются :)
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "хранение объектов различных классов в массиве"  
Сообщение от DeadMustdie email(??) on 19-Мрт-06, 13:19 
1. Определитесь, для какого языка вам это надо. Варианты реализации для C, C++ и C# будут принципиально разными. Языки разные, а сходство C и C++ просто обманчиво. Вариант на C почти наверняка соберётся компилятором C++ и будет в таком виде работать, но это будет использование микроскопа для забивания гвоздей.

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "хранение объектов различных классов в массиве"  
Сообщение от cybersun email on 19-Мрт-06, 13:24 
Эм... Спасибо за поправку. В настоящий момент мне интересены реализации решений этой проблемы на C#. Формально - пишется игрушка, герои которой хранятся в ArrayList'e. Чтобы выполнять над ними и между ними некоторые действия, необходимо получать доступ к переменным, характеризующим положение объектов на игровом поле... Объекты описаны иерархией классав, а вот дальше возникают проблемы...
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "хранение объектов различных классов в массиве"  
Сообщение от Владимир Давыдов email on 20-Мрт-06, 09:25 
>Эм... Спасибо за поправку. В настоящий момент мне интересены реализации решений этой
>проблемы на C#. Формально - пишется игрушка, герои которой хранятся в
>ArrayList'e. Чтобы выполнять над ними и между ними некоторые действия, необходимо
>получать доступ к переменным, характеризующим положение объектов на игровом поле... Объекты
>описаны иерархией классав, а вот дальше возникают проблемы...
Какие проблемы? Все классы в .NET - потомки Object. Соответсвенно иерархия у вас есть.
И раз вы храните все классы в ArrayList, то вы уже сами ответили на свой вопрос.
Выдергиваете элемент из массива и смотрите какого он класса. Например, так:
ArrayList data;
...
foreach(object obj_state in data)
{
    if(obj_state is ObjState1)
    {
        ObjState obj1 = (ObjState1)obj_state;
        ...
    }
    
}

Если у вас проблемы, то это следствие неправильного проектирования. Пишите, постараюсь помочь.


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "хранение объектов различных классов в массиве"  
Сообщение от cybersun email on 20-Мрт-06, 10:28 
>>Эм... Спасибо за поправку. В настоящий момент мне интересены реализации решений этой
>>проблемы на C#. Формально - пишется игрушка, герои которой хранятся в
>>ArrayList'e. Чтобы выполнять над ними и между ними некоторые действия, необходимо
>>получать доступ к переменным, характеризующим положение объектов на игровом поле... Объекты
>>описаны иерархией классав, а вот дальше возникают проблемы...
>Какие проблемы? Все классы в .NET - потомки Object. Соответсвенно иерархия у
>вас есть.
>И раз вы храните все классы в ArrayList, то вы уже сами
>ответили на свой вопрос.
>Выдергиваете элемент из массива и смотрите какого он класса. Например, так:
>ArrayList data;
>...
>foreach(object obj_state in data)
>{
>    if(obj_state is ObjState1)
>    {
>        ObjState obj1 = (ObjState1)obj_state;
>
>        ...
>    }
>
>}
>
>Если у вас проблемы, то это следствие неправильного проектирования. Пишите, постараюсь помочь.
>

Да, до этого я додумался... Один for для класса - это наиболее приемлемое решение. Только все равно интересно, если у меня будет порядка 50 классов, неужели придется писать 50 однотипных форов, отличающихся лишь приведением типов? Может быть есть более интересный способ? Сегодня смотрел Шилдта, зацепился за typeof. Пока реализую так, а потом поиграюсь, если останется время с тем, что узнал сегодня. К тому же, если общие свойства хранятся в parent-классе, то по ходу дела, к потомкам можно применять оператор as, который приведет потомка к типу базового класса... Это как раз на мой случай смахивает :) В общем, сейчас поэксперементирую и напишу что к чему и как выходит...

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

5. "хранение объектов различных классов в массиве"  
Сообщение от Владимир Давыдов email on 20-Мрт-06, 10:58 
>Да, до этого я додумался... Один for для класса - это наиболее
>приемлемое решение. Только все равно интересно, если у меня будет порядка
>50 классов, неужели придется писать 50 однотипных форов, отличающихся лишь приведением
>типов?

Один for для массива, а не для класса, классов может быть сколько угодно

>К тому же, если общие свойства
>хранятся в parent-классе, то по ходу дела, к потомкам можно применять
>оператор as, который приведет потомка к типу базового класса... Это как
>раз на мой случай смахивает :)

Это и есть правильное проектирование. Создаешь базовый класс и/или интерфейс, а от него наследуешь все остальные. Тогда в массиве хранишь объекты любого своего класса, приводя их к базовому, и обрабатываешь однообразно.

P.S.
Если будешь использовать оператор as, не забывай проверять на null рез-т приведения.


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

6. "хранение объектов различных классов в массиве"  
Сообщение от cybersun email on 20-Мрт-06, 10:59 
>>Да, до этого я додумался... Один for для класса - это наиболее
>>приемлемое решение. Только все равно интересно, если у меня будет порядка
>>50 классов, неужели придется писать 50 однотипных форов, отличающихся лишь приведением
>>типов?
>
>Один for для массива, а не для класса, классов может быть сколько
>угодно
>
>>К тому же, если общие свойства
>>хранятся в parent-классе, то по ходу дела, к потомкам можно применять
>>оператор as, который приведет потомка к типу базового класса... Это как
>>раз на мой случай смахивает :)
>
>Это и есть правильное проектирование. Создаешь базовый класс и/или интерфейс, а от
>него наследуешь все остальные. Тогда в массиве хранишь объекты любого своего
>класса, приводя их к базовому, и обрабатываешь однообразно.
>
>P.S.
>Если будешь использовать оператор as, не забывай проверять на null рез-т приведения.
>

Я помню! Спасибо!

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру