Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает глубокое клонирование 
:(
    Опции темы
4epT
Дата 14.5.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день!

Нужно сделать клон объекта класса, класс содержит 2 коллекции, каждый элемент коллекций сам является объектом.

Вот структуры классов и мой метод клонирования (который не работает):

Код

public class Box
{
    private Vector<Vector3D> vertexes = new Vector<Vector3D>();
    private Vector<NPair> lines = new Vector<NPair>();

    public Box(Vector3D A,Vector3D B,Vector3D C,Vector3D D,Vector3D E,Vector3D F,Vector3D G,Vector3D H)
    {
        this.vertexes.add(A);
        this.vertexes.add(B);
        this.vertexes.add(C);
        this.vertexes.add(D);
        this.vertexes.add(E);
        this.vertexes.add(F);
        this.vertexes.add(G);
        this.vertexes.add(H);
        lines.add(new NPair(0,1));//A->B
        lines.add(new NPair(1,2));//B->C
        lines.add(new NPair(2,3));//C->D
        lines.add(new NPair(3,0));//D->A
        lines.add(new NPair(4,5));//E->F
        lines.add(new NPair(5,6));//F->G
        lines.add(new NPair(6,7));//G->H
        lines.add(new NPair(7,4));//H->E
        lines.add(new NPair(0,4));//A->E
        lines.add(new NPair(1,5));//B->F
        lines.add(new NPair(2,6));//C->G
        lines.add(new NPair(3,7));//D->H
    }

    @Override
    public Object clone() throws CloneNotSupportedException
    {
        return new  Box(this.vertexes.get(0),this.vertexes.get(1),this.vertexes.get(2),this.vertexes.get(3),this.vertexes.get(4),this.vertexes.get(5),this.vertexes.get(6),this.vertexes.get(7));
    }
}


Код

public class Vector3D
{
    private double _x,_y,_z,_w;
    public Vector3D(double x, double y, double z)
    {
        _x = x;
        _y = y;
        _z = z;
    }

    public Vector3D(double x, double y, double z, double w)
    {
        _x = x;
        _y = y;
        _z = z;
        _w = w;
    }
}


Код

public class NPair
{
    public int n1,n2;

    public NPair(int n1, int n2)
    {
        this.n1 = n1;
        this.n2 = n2;
    }
}


Подскажите пожалуйста как правильно переопределить метод clone ?
PM MAIL   Вверх
aleksandy
Дата 15.5.2009, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Помимо создания метода clone() у класса Box, нужно создать этот метод и у класса Vector3D.
А сам метод класса Box переписать вот так:
Код

  @Override
  public Object clone() throws CloneNotSupportedException {
    return new Box(
      this.vertexes.get(0).clone(),
      this.vertexes.get(1).clone(),
      this.vertexes.get(2).clone(),
      this.vertexes.get(3).clone(),
      this.vertexes.get(4).clone(),
      this.vertexes.get(5).clone(),
      this.vertexes.get(6).clone(),
      this.vertexes.get(7).clone()
    );
  }

PM   Вверх
Connie
Дата 15.5.2009, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



4epT, 
а) нужен конструктор копирования, по такому типу
Код

public Box(Box source){

for(Vector3D item source.vertexes){
vertexes.add(item);
}
for(NPair item source.lines){
lines.add(item);
}

}


При этом код clone будет выглядеть так
Код

@Override
    public Object clone() throws CloneNotSupportedException
    {
        return new  Box(this);
    }

Но лучше его не использовать, а использовать там где нужно именно конструктор копирования.

P.S. Это вроде основы ООП 

Это сообщение отредактировал(а) Connie - 15.5.2009, 08:49
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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