Как скопировать предка потомку - PullRequest
0 голосов
/ 11 июня 2009

Допустим, у меня есть животное, и теперь я хочу сделать его собакой. Как мне сделать это в Java?

Сейчас у меня есть конструктор, который выглядит как

public Dog(Animal animal) {
  this.setProperty(animal.getProperty);
  ...
}

Хотя это работает, оно хрупкое. Любые другие предложения?

Ответы [ 4 ]

5 голосов
/ 11 июня 2009

Если ваша собака расширяет Animal, вы можете создать конструктор, который берет Animal и инициализирует супер (родительский) конструктор:

public class Dog extends Animal {
    public Dog(Animal animal) {
        super(animal);
    }
}

Предполагается, что у вас есть класс Animal, у которого есть конструктор копирования в этой форме:

public class Animal {
    public Animal(Animal animal) {
        // copies all properties from animal to this
    }
}

Вы можете создать собаку из животного, сделав что-то вроде этого:

Dog newDog = new Dog(myExistingAnimal);
0 голосов
/ 12 июня 2009

Я не уверен, что именно вы хотите, поэтому я собираюсь предположить, что вы хотите, чтобы объект Animal, улучшенный на месте, был объектом Dog.

class AnimalImpl {
    // ...
}

class DogImpl extends AnimalImpl {
    // ...
}

class Animal {
    private AnimalImpl implementation;
    public Animal() {
        implementation = new AnimalImpl;
    }
    public void becomeADog() {
        implementation = new DogImpl(implementation);
    }
    // ...
}

Используйте это так:

Animal animal = getAnAnimalFromSomewhere();
// `animal` has generic Animal behaviour
animal.becomeADog();
// `animal` now has Dog behaviour

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

0 голосов
/ 12 июня 2009

Попробуйте использовать фабрику. Вместо того, чтобы основывать его на конструкторе, используйте фабрику, чтобы вернуть определенный тип Animal, основываясь на ваших ограничениях.

0 голосов
/ 11 июня 2009

Вы хотите создать подкласс класса Animal? Вы также можете использовать:

public class Dog extends Animal { 
    public Dog () {
        super();
        // other constructor stuff
    }
}

Тогда ваш объект Dog уже унаследует свойства.

...