Я хотел бы создать копию объекта, который содержит суперкласс другого объекта. В этом примере я хочу сделать копию 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);
// ...
}
}
У меня нет идеи, как подойти к этой проблеме.
Make Toy
имеет абстрактный метод copy()
с возвращаемым типом Toy
. Тогда вы будете вынуждены переопределить это в Car
and Puppet
. В конструкторе копирования для Box
вы можете использовать box.getToy().copy()
.
Вы можете переопределить метод клонирования каждого подкласса Toy
и затем:
public Box(Box box) {
this.toy = (Toy) box.getToy().clone();
}
В качестве альтернативы, если у вас есть постоянное количество типов игрушек, вы можете использовать перечисление вместо класса.
Я думаю, что эта структура может помочь вам в идее, в этом случае мы передаем игру 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;
}
}
и либо, если вы не хотите, чтобы другие классы (подкласс) не видели указанные методы и атрибуты, просто делали их закрытыми, а если вы хотите, чтобы подкласс не имел доступа к настройкам и методам получения, сделайте их приватными только!
Object.clone
уже имеет эту семантикуclone()
. Я предпочитаю избегать этого, потому что это беспорядок (уCloneable
нет методаclone
т. Д. И т. Д.).