2009-06-11 4 views
0

Disons que j'ai un animal et maintenant je veux en faire un chien. Comment puis-je faire cela en Java?Comment copier un ancêtre à un descendant

En ce moment, j'ai un constructeur qui ressemble

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

Bien que cela fonctionne, il est fragile. D'autres suggestions?

+0

Qu'est-ce qui vous intéresse d'accomplir: 1) Prendre une instance générique d'Animal et l'utiliser pour créer une instance plus spécialisée de Dog? OU 2) Prendre une instance spécialisée d'une sous-classe Animal autre que Dog et l'utiliser pour créer une nouvelle instance de Dog. Je suppose que Dog est une sous-classe d'Animal puisque vous demandez à propos de "[copier] un ancêtre à un descendant" –

+0

J'ai une instance d'un "Animal" et je veux en faire une instance de "Chien" , puis ajoutez toutes les propriétés spécifiques de mon chien. – Preston

Répondre

5

Si votre chien s'étend des animaux, vous pouvez créer un constructeur qui prend un animal et initialise le super (parent) constructeur:

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

En supposant que vous avez une classe d'animaux qui a un constructeur de copie sous cette forme:

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

Vous pouvez créer un chien d'un animal en faisant quelque chose comme ceci:

Dog newDog = new Dog(myExistingAnimal); 
+0

C'est plus ou moins la même solution que j'ai maintenant, sauf que le code de la copie est dans le descendant. Cela améliore la conception, mais il semble toujours qu'il devrait y avoir une meilleure solution disponible. Qu'en est-il de l'utilisation de la réflexion? – Preston

-1

Souhaitez-vous sous-classer la classe Animal? Vous pouvez également utiliser:

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

Ensuite, votre objet Dog aurait déjà hériter des propriétés.

0

Essayez et utilisez une usine. Plutôt que de le baser sur le constructeur, utilisez une fabrique pour renvoyer un type d'animal spécifique en fonction de vos contraintes.

0

Je ne sais pas exactement ce que vous voulez, donc je vais supposer que vous voulez que l'objet Animal soit mis à jour pour être un objet Dog.

class AnimalImpl { 
    // ... 
} 

class DogImpl extends AnimalImpl { 
    // ... 
} 

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

utiliser comme ceci:

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

Cela pourrait ne pas être ce que vous voulez, mais il peut être utile lorsqu'un objet doit avoir un comportement très différent, en fonction de son état.

Questions connexes