【问题标题】:Java creating devired class from baseJava从基创建派生类
【发布时间】:2023-01-26 19:42:23
【问题描述】:

假设我有基类

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 并在 B 中填充 A 中的所有字段,并具有一些构造新字段的逻辑。是这样的:

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

但这对我来说不合适,获取对象的字段只是为了调用同一个类的构造函数......如果基类有很多字段怎么办,你将需要获取所有字段以调用构造函数,看起来不太好,所以我想知道有没有更好的方法?

【问题讨论】:

    标签: java oop inheritance constructor


    【解决方案1】:

    你可以做一个复制构造函数,也可以做这样的事情:

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

    另一种选择可能是委托,但这取决于您的课程:

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

    【讨论】:

      猜你喜欢
      • 2015-08-10
      • 2014-09-29
      • 2013-02-21
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 2013-08-21
      相关资源
      最近更新 更多