Я не уверен, что именно вы хотите, поэтому я собираюсь предположить, что вы хотите, чтобы объект 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
Возможно, это не то, что вам нужно, но это может быть полезно, когда объект должен вести себя по-разному, в зависимости от его состояния.