在超类中定义私有子类成员的相同处理

时间:2018-05-04 07:56:39

标签: java inheritance private abstract access

我有这个父类:

abstract class Parent {
  abstract int getX();
}

两个不同的子类实现:

class AgnosticChild extends Parent {

  private int x = 5;

  @Override
  int getX() {
    return x;
  }
}

class ManipulativeChild extends Parent {

  private static int x = 5;

  ManipulativeChild() {
    x++;
  }

  @Override
  int getX() {
    return x;
  }
}

两个getX()实现都是相同的。有没有办法摆脱这种冗余,同时保持x的不同实现?假设getX()实现在实践中更加精细。

2 个答案:

答案 0 :(得分:3)

不,两个实现不相同 - 一个访问静态字段,另一个访问实例字段。因此,尽管它们看起来相同,但它们在功能上却非常不同;并且在没有改变课程行为的情况下,没有机会在这里重复使用。

答案 1 :(得分:2)

您可以将int变量拉到Parent类并在那里实现getX方法

abstract class Parent {
    private int x;

    public Parent(int x) {
        this.x = x;
    }

    public int getX() {
        return x;
    }

}

class AgnosticChild extends Parent {

    public AgnosticChild() {
        super(5);
    }


}

class ManipulativeChild extends Parent {


    ManipulativeChild() {
        super(6);
    }
}

更新:如果您要将x中的ManipulativeChild声明为非静态字段,则上方代码段仅等于您的代码。否则这些是两种不同的实现,不能以建议的方式重构。