簡體   English   中英

Java:如何在給定基礎實例的情況下構造派生類實例?

[英]Java: How to construct derived class instance given base instance?

鑒於:

@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() { ... }
}

我要寫:

Derived createDerived(Base baseInstance, int extra) { ... }

產生Derived實例,該實例具有與'baseInstance'相同的Base屬性值。

在以下情況下,最有效的方法是什么?

  1. 基本和派生都可以修改
  2. 基礎關閉,但派生打開

我想避免像這樣在派生代碼中顯式枚舉Base的成員:

    Derived createDerived(Base b, int extra) {
      setX(b.getX());
      setY(b.getY());
      setZ(b.getZ());
      ...
      this.extra = extra;
    }

或這個:

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

然后,對Base的任何添加都會破壞Derived類代碼。

對於Base使用一個假設的副本構造函數,這樣的事情將是更好的選擇:

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

生成該副本構造函數的最佳方法是什么? 同樣,最好避免枚舉Base的每個成員。

如果可以修改Base ,我將添加一個副本構造函數並從Derived調用它:

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;
    }
}

如果您不能修改Base ,您仍然可以將實例傳遞給Derived ,然后通過super分別復制每個字段:

Derived(Base base, int extra) {
    super(base.field, extra);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM