2009-06-11 2 views
0

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

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

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

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

+0

Что вас интересует: 1) Принимая общий экземпляр Animal и используя его для создания более специализированного экземпляра Dog? OR 2) Принимая специализированный экземпляр некоторого подкласса Animal, кроме Dog, и используя его для создания нового экземпляра Dog. Я предполагаю, что Собака является подклассом Животных, так как вы спрашиваете о «[копировании] предка потомству» –

+0

У меня есть экземпляр «Животного» и вы хотите превратить его в экземпляр «Собака», , затем добавьте все свойства моей собаки. – Preston

ответ

5

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

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

Если у вас есть класс животных, который имеет конструктор копирования в таком виде:

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

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

Dog newDog = new Dog(myExistingAnimal); 
+0

Это более или менее то же самое решение, что и сейчас, за исключением того, что код копирования находится в потоке потомков. Это улучшает дизайн, но по-прежнему кажется, что должно быть лучшее решение. Как об использовании отражения? – Preston

-1

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

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

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

0

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

0

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

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

Смежные вопросы