我有两个类,其结构类似于以下代码。
public class ClassOne {
private Data data;
public ClassOne(Data data) {
this.data = data;
}
public Data getData() {
return data;
}
public static class Data {
//code one
}
}
public class ClassTwo {
private Data data;
public ClassTwo(Data data) {
this.data = data;
}
public Data getData() {
return data;
}
public static class Data {
//code two
}
}
如您所见,这两个类具有Data
对象,它具有不同的实现。我可以在父类中移动Data
对象并在这两个类中实现它吗?它可能看起来像下面的代码。
public abstract class AbstractClass {
Data data;
public AbstractClass(Data data) {
this.data = data;
}
public Data getData() {
return data;
}
public abstract class Data{}
}
public class ClassOne extends AbstractClass {
public ClassOne(Data data) {
super(data);
}
//Implementation from AbstractClass.Data
public class Data {
//code one
}
}
public class ClassTwo extends AbstractClass {
public ClassTwo(Data data) {
super(data);
}
//Implementation from AbstractClass.Data
public class Data {
//code two
}
}
据我所知,Java只能extends
一个类,所以如何实现内部抽象类(Data
)?
答案 0 :(得分:1)
如果创建一个静态嵌套类,那么它将成为外部类的一个组成部分。在您的示例中,两个具有相同名称Data
的不同类是外部类ClassOne
和ClassTwo
的一部分。由于具有相同名称Data
的两个类的实现是不同的,因此保持它们的方式没有任何害处。无论如何,你不会像计划创建一个抽象类那样获得任何优势,然后尝试将它强加给其他两个类。 IMO它的方式非常好。
考虑两个类AVLTree
和RedBlackTree
的示例,这两个类都可能需要一个类Node
,它本质上是不同的。所以它非常好,你不需要重构代码。
答案 1 :(得分:0)
如果我能正确理解你的问题,我会这样做。
public class AbstractClass {
protected AbstractData data;
public AbstractClass(AbstractData data) {
this.data=data;
}
public AbstractData getData() {
return data;
}
public static interface AbstractData {
public int getInt();
public boolean getBool();
}
}
public class ClassOne extends AbstractClass {
public ClassOne(AbstractData data) {
super(data);
}
@Override
public AbstractData getData() {
return data.getBool() ? data : null;
}
public static class DataOne implements AbstractData {
@Override
public int getInt() {
return 0;
}
@Override
public boolean getBool() {
return false;
}
}
}
public class DataTwo implements AbstractClass.AbstractData {
@Override
public int getInt() {
return 42;
}
@Override
public boolean getBool() {
return true;
}
}
您可以根据需要将AbstractClass
和ClassOne
与DataOne
和DataTwo
结合使用。
但是我不明白为什么AbstractClass
应该是抽象的,所以它不在这个例子中。当然,您可以将其抽象化并根据需要添加抽象方法。