【问题标题】:How to copy an ancestor to a descendant如何将祖先复制到后代
【发布时间】:2009-06-11 17:31:25
【问题描述】:

假设我有一只动物,现在我想把它变成一只狗。我如何在 java 中执行此操作?

现在我有一个看起来像这样的构造函数

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

虽然这可行,但它很脆弱。还有其他建议吗?

【问题讨论】:

  • 您对完成什么感兴趣:1) 获取 Animal 的通用实例并使用它来创建更专业的 Dog 实例?或 2) 获取除 Dog 之外的某个 Animal 子类的专用实例,并使用它来创建 Dog 的新实例。我假设 Dog 是 Animal 的子类,因为您要询问“[复制]祖先到后代”
  • 我有一个“动物”的实例,想把它变成一个“狗”的实例,然后添加我所有的狗特定属性。

标签: java inheritance copy clone


【解决方案1】:

如果您的 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);

【讨论】:

  • 这与我现在的解决方案差不多,只是复制代码在后代中。这确实改善了设计,但仍然感觉应该有更好的解决方案可用。使用反射呢?
【解决方案2】:

尝试使用工厂。与其基于构造函数,不如使用工厂根据您的约束返回特定类型的 Animal。

【讨论】:

    【解决方案3】:

    我不确定你想要什么,所以我假设你希望将 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
    

    这可能不是您想要的,但是当一个对象根据其状态应该具有完全不同的行为时,它会很有用。

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      相关资源
      最近更新 更多