如何在Java的实现类中实现抽象类中的抽象类?

时间:2015-05-08 04:20:12

标签: java inheritance abstract-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

  }
}

如您所见,这两个类具有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)?

2 个答案:

答案 0 :(得分:1)

如果创建一个静态嵌套类,那么它将成为外部类的一个组成部分。在您的示例中,两个具有相同名称Data的不同类是外部类ClassOneClassTwo的一部分。由于具有相同名称Data的两个类的实现是不同的,因此保持它们的方式没有任何害处。无论如何,你不会像计划创建一个抽象类那样获得任何优势,然后尝试将它强加给其他两个类。 IMO它的方式非常好。

考虑两个类AVLTreeRedBlackTree的示例,这两个类都可能需要一个类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;
    }
}

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

但是我不明白为什么AbstractClass应该是抽象的,所以它不在这个例子中。当然,您可以将其抽象化并根据需要添加抽象方法。