Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копия элемента ArrayList 
V
    Опции темы
ainis
Дата 10.3.2009, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.2.2009

Репутация: нет
Всего: нет



Есть массив типа ArrayList (назовем его AL), содержащий множество объектов созданного мной класса. Надо в этот массив добавить еще один элемент, причем этот элемент должен быть копией какого-либо существующего элемента массива AL.
Т. е., допустим, массив AL содержит 10 элементов, я беру третий элемент, создаю его копию и добавляю в конец массива AL. При это третий элемент и добавленный элемент, по сути, представляют собой одно и то же, т. е. ссылаются на одно и то же место в памяти, насколько я понимаю.
Как разорвать эту связь? Как сделать так, чтобы третий элемент массива AL (для нашего случая) и последний добавленный элемент этого массива представляли собой независимые объекты?
PM MAIL   Вверх
Rififi
Дата 10.3.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



ainis, 
класс должен реализовывать интерфейс ICloneable
PM MAIL   Вверх
ainis
Дата 11.3.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.2.2009

Репутация: нет
Всего: нет



Спасибо! Действительно, все оказалось очень просто.   smile 
PM MAIL   Вверх
ainis
Дата 12.3.2009, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.2.2009

Репутация: нет
Всего: нет



Оказалось, что все не так просто. 
Дело в том, что объекты массива AL тоже содержат массивы (ArrayList) объектов, которые, в свою очередь, опять же могут содержать массивы.Например:

Public Class A
  'массив AL содержит объекты класса AA
 Public AL As New ArrayList

End Class


Public Class AA
 'массив massAA содержит объекты класса AAA
 Public massAA As New ArrayList

End Class


Public Class AAA
 'здесь тоже могут быть массивы объектов
End Class


При использовании интерфейса ICloneable следующий код осуществляет всего лишь поверхностное копирование, т. е. по-прежнему копирует ссылки в массиве massAA объектов класса AA.


Public Class A
 Implements ICloneable
 'массив AL содержит объекты класса AA
 Public AL As New ArrayList
 Public Function Clone() As Object Implements System.ICloneable.Clone
  Dim newA as A
  newA = CType(Me.MemberwiseClone, A)
  newA.AL = CType(AL.Clone, ArrayList)
  Return newA 
 End Function
End Class

В классы AA и AAA я тоже "запихал" ICloneable и написал соотв. функции Clone.
Как теперь использовать эти интерфейсы в классе A для полного копирования?
Простой перебор элементов массива AL и попытка клонирования по одному приводит к ошибке.
PM MAIL   Вверх
ainis
Дата 12.3.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.2.2009

Репутация: нет
Всего: нет



Вроде справился с помощью сериализации, НО... (Это чертово НО меня уже достало!  smile ).
Один из массивов содержит объекты класса GraphicsPath, а этот класс несериализуем. Как тут можно выйти из ситуации?
PM MAIL   Вверх
ainis
Дата 15.3.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.2.2009

Репутация: нет
Всего: нет



Проблема решена. Заменил GraphicsPath на Rectangle. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0416 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.