如何在 Java 中实现 class 中的抽象 class 中实现抽象 class?
How do I implement abstract class inside abstract class in the implementation class in Java?
我有两个 class 结构如下代码所示。
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
}
}
如您所见,这两个 classes 具有 Data
具有不同实现的对象。我可以移动父 class 中的 Data
对象并在这两个 class 中实现它吗?它可能类似于以下代码。
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
一个class,那么如何实现内部抽象class(Data
)?
如果您创建静态嵌套 class,那么它将成为外部 class 的组成部分。在您的示例中,两个具有相同名称 Data
的不同 classes 是外部 classes ClassOne
和 ClassTwo
的一部分。由于具有相同名称 Data
的两个 classes 的实现是不同的,所以保持它们的原样并没有什么坏处。无论如何,您不会以计划创建抽象 class 然后尝试将其强加给其他两个 class 的方式获得任何优势。 IMO 它现在的样子非常好。
考虑两个 classes AVLTree
和 RedBlackTree
的例子,这两个 classes 可能需要一个 class Node
性质会有所不同。所以它非常好,你不需要重构代码。
如果我正确理解你的问题,这就是我会做的。
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
应该是抽象的,所以它不在这个例子中。当然你也可以把它抽象成你喜欢的抽象方法。
我有两个 class 结构如下代码所示。
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
}
}
如您所见,这两个 classes 具有 Data
具有不同实现的对象。我可以移动父 class 中的 Data
对象并在这两个 class 中实现它吗?它可能类似于以下代码。
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
一个class,那么如何实现内部抽象class(Data
)?
如果您创建静态嵌套 class,那么它将成为外部 class 的组成部分。在您的示例中,两个具有相同名称 Data
的不同 classes 是外部 classes ClassOne
和 ClassTwo
的一部分。由于具有相同名称 Data
的两个 classes 的实现是不同的,所以保持它们的原样并没有什么坏处。无论如何,您不会以计划创建抽象 class 然后尝试将其强加给其他两个 class 的方式获得任何优势。 IMO 它现在的样子非常好。
考虑两个 classes AVLTree
和 RedBlackTree
的例子,这两个 classes 可能需要一个 class Node
性质会有所不同。所以它非常好,你不需要重构代码。
如果我正确理解你的问题,这就是我会做的。
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
应该是抽象的,所以它不在这个例子中。当然你也可以把它抽象成你喜欢的抽象方法。