Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何在给定基实例的情况下构造派生类实例?_Java - Fatal编程技术网

Java:如何在给定基实例的情况下构造派生类实例?

Java:如何在给定基实例的情况下构造派生类实例?,java,Java,鉴于: 我想写: @lombok.Data // generates get/set methods for all data members public class Base { private int x; private double y; private String z; ... } public class Derived extends Base { private int extra; public String addedM

鉴于:

我想写:

@lombok.Data // generates get/set methods for all data members
public class Base {
    private int x;
    private double y;
    private String z;
    ...
}


public class Derived extends Base {
    private int extra;
    public String addedMethod() { ... }
}
生成与“baseInstance”具有相同基本属性值的派生实例

在以下情况下,最有效的方法是什么:

  • 基础和派生都可以修改
  • 基底是封闭的,但派生的是开放的
  • 我希望避免在派生代码中显式枚举Base的成员,如下所示:

    Derived createDerived(Base baseInstance, int extra) { ... }
    
    或者这个:

        Derived createDerived(Base b, int extra) {
          setX(b.getX());
          setY(b.getY());
          setZ(b.getZ());
          ...
          this.extra = extra;
        }
    
    对Base的任何添加都会破坏派生类代码

    类似这样的方式更可取,使用一个假设的复制构造函数作为基:

    Derived createDerived(Base b, int extra) {
        super(b.getX(), b.getY(), b.getY(), ...);
        this.extra = extra;
    }
    

    生成复制构造函数的最佳方法是什么?同样,最好避免枚举Base的每个成员。

    如果可以修改
    Base
    ,我会添加一个副本构造函数,并从
    派生的
    调用它:

        Derived createDerived(Base b, int extra) {
          super(b);
          this.extra = extra;
        }
    
    如果您不能修改
    Base
    ,您仍然可以将一个实例传递给
    Derived
    ,然后通过
    super
    分别复制每个字段:

    class Base {
        int field;
    
        Base(int field) {
            this.field = field;
        }
    
        Base(Base base) {
            this(base.field);
        }
    }
    
    class Derived extends Base {
        int extra;
    
        Derived(Base base, int extra) {
            super(base);
            this.extra = extra;
        }
    }
    

    ... 你为什么要这样做?如果操作正确,您可以访问子类中的所有父类字段。我不明白这个问题。你能扩展这个例子吗?更详细地描述场景?我甚至不知道
    extend
    应该做什么。你能给我们看一些代码吗?您能否至少描述一下调用
    extends()
    的结果?
    Derived(Base base, int extra) {
        super(base.field, extra);
    }