Arz*_*bek 1 java oop inheritance constructor
假设我有一个基类:
Class A {
public String field1;
public A(String field1){
this.field1 = field1;
}
}
Run Code Online (Sandbox Code Playgroud)
和一个 devired 类:
Class B extends A {
public String field2;
}
Run Code Online (Sandbox Code Playgroud)
假设我有一个List<A> listA,如何创建一个构造函数以便我可以轻松地将这个列表转换为List<B> listB?我想要有一个构造函数,B class它将获取并填充其中A object的所有字段,并具有一些逻辑来构造新字段。像这样的东西:AB
Class B extends A {
public String field2;
public B (A a){
this = a;
this.field2 = doLogic(a);
}
}
Run Code Online (Sandbox Code Playgroud)
或者至少填写 B 中 A 的所有字段:
public B(A a){
this = a;
}
Run Code Online (Sandbox Code Playgroud)
所以稍后我可以手动将 , 字段设置B为如下所示:
listA.stream().map(x -> new B(x)).map(x -> x.setField2(logic(x)));
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
Class B extends A {
public String field2;
public B(A a){
super(a.getField1());
}
}
Run Code Online (Sandbox Code Playgroud)
但这对我来说看起来不太正确,获取对象的字段只是为了调用同一类的构造函数。
如果基类有很多字段,您是否需要获取所有字段以在构造函数中调用?看起来不太好,所以我想知道是否有更好的方法。
如果基类有很多字段怎么办
当然,第一个问题是为什么需要它以及是否有其他方法。在这个答案中,我假设您已经回答了这个问题并得出了您需要它的结论。
假设我有一个
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
}
}
Run Code Online (Sandbox Code Playgroud)
完成此操作后,您可以使用普通迭代或流式传输将 a 转换List<A>为 a List<B>:
List<B> convertedList = origList.stream().map(a -> new B(a)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
另一种选择可能是委派,但这取决于您的课程:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这样做会使 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();
}
}
Run Code Online (Sandbox Code Playgroud)