私が動物を飼っていて、それを犬にしたいとしましょう。Javaでこれを行うにはどうすればよいですか?
今、私は次のようなコンストラクタを持っています
public Dog(Animal animal) {
this.setProperty(animal.getProperty);
...
}
これは機能しますが、壊れやすいです。他の提案はありますか?
私が動物を飼っていて、それを犬にしたいとしましょう。Javaでこれを行うにはどうすればよいですか?
今、私は次のようなコンストラクタを持っています
public Dog(Animal animal) {
this.setProperty(animal.getProperty);
...
}
これは機能しますが、壊れやすいです。他の提案はありますか?
Dog が 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);
あなたが何を望んでいるのか正確にはわからないので、動物オブジェクトをアップグレードして犬オブジェクトにしたいと仮定します。
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
これはあなたが望むものではないかもしれませんが、オブジェクトがその状態に応じて大幅に異なる動作を持つ必要がある場合に役立ちます。
工場を使ってみてください。コンストラクターに基づくのではなく、ファクトリを使用して、制約に基づいて特定のタイプのアニマルを返します。
Animal クラスをサブクラス化しますか? 以下を使用することもできます。
public class Dog extends Animal {
public Dog () {
super();
// other constructor stuff
}
}
その場合、Dog オブジェクトは既にプロパティを継承しています。