Скопируйте объект, который содержит суперкласс другого объекта

1

Я хотел бы создать копию объекта, который содержит суперкласс другого объекта. В этом примере я хочу сделать копию Box, содержащей Toy. Но всевозможные игрушки могут быть в коробке. Каким будет лучший способ создать конструктор копирования в Toy?

class Box {
    Toy toy;
    public Box(Toy toy) {
        this.toy = toy;
    }
    public Box(Box box) {
        this.toy = new Toy(box.getToy());
    }
}
abstract class Toy {
    public Toy(String name) {
        // ...
    }
}   
class Car extends Toy {
    public Car(String name) {
        super(name);
        // ...
    }
}
class Puppet extends Toy {
    public Puppet(String name) {
        super(name);
        // ...
    }
}

У меня нет идеи, как подойти к этой проблеме.

Теги:
oop
copy-constructor

3 ответа

6
Лучший ответ

Make Toy имеет абстрактный метод copy() с возвращаемым типом Toy. Тогда вы будете вынуждены переопределить это в Car and Puppet. В конструкторе копирования для Box вы можете использовать box.getToy().copy().

  • 0
    Зачем создавать определенный метод для этого? Object.clone уже имеет эту семантику
  • 1
    Вы можете использовать clone() . Я предпочитаю избегать этого, потому что это беспорядок (у Cloneable нет метода clone т. Д. И т. Д.).
Показать ещё 2 комментария
1

Вы можете переопределить метод клонирования каждого подкласса Toy и затем:

public Box(Box box) {
    this.toy = (Toy) box.getToy().clone();
}

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

0

Я думаю, что эта структура может помочь вам в идее, в этом случае мы передаем игру Object с использованием Box Constructor для SuperClass (Toy), а в Toy Class у нас есть конструктор, чтобы принять объект из Toy Toy, тогда он вызывает метод getInstance для инициализации игрушечный объект (например, например).

class Box extends Toy
{
  public Box(Toy toy) 
  {
     super(toy);
  }
}
Class Toy
{
   private static Toy toys = new Toy();
   Toy(){}
   Toy(Toy toy)
   {
      toy = Toy.getInstance();
   }
   public static Toy getInstance()
   {
     return toys;
   }
}

и либо, если вы не хотите, чтобы другие классы (подкласс) не видели указанные методы и атрибуты, просто делали их закрытыми, а если вы хотите, чтобы подкласс не имел доступа к настройкам и методам получения, сделайте их приватными только!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню