Определить идентичный режим для членов частного подкласса в суперклассе - PullRequest
0 голосов
/ 04 мая 2018

У меня есть родительский класс:

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 голосов
/ 04 мая 2018

Нет, две реализации не идентичны - одна обращается к статическому полю, а другая - к полю экземпляра. Таким образом, хотя они выглядят одинаково, они функционально очень разные; и здесь нет возможности для повторного использования без изменения поведения ваших классов.

0 голосов
/ 04 мая 2018

Вы можете вывести переменную int в родительский класс и реализовать там метод 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 как нестатическое поле. В противном случае это две разные реализации и не могут быть реорганизованы предложенным способом.

...