Java - 我可以扩展类的实例以使其成为父类实例吗?

G33*_*33K 6 java oop maintainability inheritance instance

这是我想要实现的目标的一个小例子。我有一个有很多参数的类 - Dog。我有一个子类JumpyDog,我想了解如何“扩展” 的实例Dog以使其成为 的实例JumpyDog

class Dog {
    int age, numberOfTeeth, grumpiness, manyOtherParameters;
    JumpyDog learnToJump(int height) {
        JumpyDog jumpy = new JumpyDog(this); // I do not want to copy all parameters
        jumpy.jumpHeight=height;
        return jumpy;
    }
}

class JumpyDog extends Dog {
    int jumpHeight;
    void jump(){}
}
Run Code Online (Sandbox Code Playgroud)

或者我可以这样说:

Dog dog=new Dog();
dog.makeJumpy();
dog.jump()
Run Code Online (Sandbox Code Playgroud)

Phi*_*nov 3

您可以在 Java 中实现装饰器模式,以避免在“扩展”期间从初始对象复制所有字段,只需在内部保留对它的引用,但它不会再这样了Dog(因为Dog类具有我们避免复制的字段)。

class JumpyDog {
    Dog meAsDog;
    int jumpHeight;

    public JumpyDog(Dog me) {
        meAsDog = me;
    }

    public Dog meAsDog() {
        return meAsDog();
    }

    void jump(){}
}
Run Code Online (Sandbox Code Playgroud)

您可以像下面这样使用它:

Dog dog=new Dog();
JumpyDog meAsJumpy = dog.learnToJump(100);
meAsJumpy.jump()
Run Code Online (Sandbox Code Playgroud)

不,您不能从示例中执行以下操作,因为Dog还没有jump()方法:

Dog dog=new Dog();
dog.makeJumpy();
dog.jump() // Dog has no method jump
Run Code Online (Sandbox Code Playgroud)