如何在 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 ClassOneClassTwo 的一部分。由于具有相同名称 Data 的两个 classes 的实现是不同的,所以保持它们的原样并没有什么坏处。无论如何,您不会以计划创建抽象 class 然后尝试将其强加给其他两个 class 的方式获得任何优势。 IMO 它现在的样子非常好。

考虑两个 classes AVLTreeRedBlackTree 的例子,这两个 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;
    }
}

在这里您可以根据需要将 AbstractClassClassOneDataOneDataTwo 结合使用。

但我不明白为什么 AbstractClass 应该是抽象的,所以它不在这个例子中。当然你也可以把它抽象成你喜欢的抽象方法。