Наследование Java: есть ли способ указать, что только один из двух методов должен быть переопределен - PullRequest
1 голос
/ 31 декабря 2010

Для некоторых производных классов я хочу убедиться, что один из двух перегруженных абстрактных методов переопределяется, но не оба. Возможно ли это?


abstract void move();
abstract void move(int x, int y);

Существует класс абстрактных частиц, который расширен несколькими классами. Один из производных классов получает данные от мыши для расчета своего движения, а другие - нет. Все производные классы имеют функцию перемещения. Каков хороший способ кодирования наследования для этого?

Ответы [ 4 ]

4 голосов
/ 31 декабря 2010

Нет, это невозможно, так как это нарушит правила полиморфизма.Вы должны переосмыслить свою архитектуру, так как это сильный запах кода.

4 голосов
/ 31 декабря 2010

Нет. Но если вы объясните, почему вы хотите это сделать, возможно, есть и другие варианты.

1 голос
/ 31 декабря 2010

Нет, Java требует, чтобы все методы abstract были реализованы конкретными подклассами.

Оставьте решение о том, следует ли игнорировать параметры вызывающему, а не вызывающему.Возьмем, к примеру, гипотетическую систему 3D-рендеринга с несколькими механизмами рендеринга:

abstract class Renderer {
  boolean isPointVisible(int x, int y);
}

class SimpleRenderer {
  @Override
  public boolean isPointVisible(int x, int y) {
    return true;
  }
}

class ComplexRenderer {
  @Override
  public boolean isPointVisible(int x, int y) {
    return x > 0 && x < 100 && y < 0 && y < 100;
  }
}
0 голосов
/ 31 декабря 2010

Учитывая, что ряд стратегий может изменить состояние частицы, кажется, что ответственность за ее перемещение должна быть внешней по отношению к самой частице. Кажется, что частица сама по себе должна быть простым конкретным классом, который содержит информацию о состоянии (то есть положение и т. Д.), В то время как во время выполнения вы можете определить, какая стратегия будет действовать при изменении состояния частицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...