Java从基类创建派生类

jyztefdp  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(122)

假设我有一个基类:

Class A {
    public String field1;

    public A(String field1){
        this.field1 = field1;
    }
}

和一个衍生类:

Class B extends A {
    public String field2;
}

假设我有一个List<A> listA,我如何创建一个构造函数,这样我就可以很容易地将这个列表转换为List<B> listB?我想在B class中有一个构造函数,它将接受A object,并填充BA的所有字段,并有一些逻辑来构造新字段。

Class B extends A {
    public String field2;

    public B (A a){
        this = a;
        this.field2 = doLogic(a);
    }
}

或者至少只需填写B中A的所有字段:

public B(A a){
    this = a;
}

因此,稍后我可以手动将字段从B设置为如下形式:

listA.stream().map(x -> new B(x)).map(x -> x.setField2(logic(x)));

我知道我可以这样做:

Class B extends A {
    public String field2;

    public B(A a){
        super(a.getField1());
    }
}

但这在我看来不太对,获取对象的字段只是为了调用同一个类的构造函数。
如果基类有很多字段,你需要在构造函数中调用所有的字段吗?这看起来不太好,所以我想知道是否有更好的方法。

lyfkaqu1

lyfkaqu11#

如果基类有很多字段怎么办
当然,第一个问题是你为什么需要它,是否有其他的方法,在这个答案中,我假设你已经回答了这个问题,并得出了你需要它的结论。
假设我有一个List<A> listA,我如何创建一个构造函数,以便可以轻松地将此列表转换为List<B> listB
你可以做一个复制构造函数,也可以做类似这样的事情:

class A { 
  A(A other) {
    //copy fields
  }
}

class B extends A {
  B(A other) {
    super(other);
    //init B fields
  }
}

有了这些,你就可以使用简单的迭代或者流来将List<A>转换成List<B>

List<B> convertedList = origList.stream().map(a -> new B(a)).collect(Collectors.toList());

另一个选择可能是委托,但这将取决于您的类:

class B extends A {
  A delegate;      

  B(A delegate) {
    this.delegate = delegate;
    //init B fields
  }

  @Override
  void setField1(String value) {
    delegate.setField1(value);
  }

  @Override
  String getField1() {
    return delegate.getField1();
  }
}

这样做会使B的“field1”为空,因此这可能不是最佳选择。如果你有一个A的接口,它看起来会很相似,但会留下更少的“空”字段:

interface AInterface {
  void setField1(String value);
  String getField1();
}

class A implements AInterface {
   ...
}

class B implements AInterface {
  AInterface delegate;
  
  B(AInterface delegate) {
     this.delegate = delegate;
    //init B fields
  }

  @Override //this is not an actual override but an implementation
  public void setField1(String value) {
    delegate.setField1(value);
  }

  @Override //this is not an actual override but an implementation
  public String getField1() {
    return delegate.getField1();
  }
}

相关问题