Как бороться со сменными базовыми классами в Java - PullRequest
1 голос
/ 23 мая 2010

У меня проблема с наследованием, которое я делаю.По сути, у меня есть абстрактный класс LineCalculator, который, как предполагается, вычисляет строки уравнения.Оттуда я наследую этот базовый класс в LinearLineCalculator, который вычисляет линии в декартовой системе координат, и PolarLineCalculator, который вычисляет линии в полярной системе координат.

public abstract class LineCalculator {

    // Begins calculating a line based on the parameters
    protected final Path2D.Double calculateLine(...) {
    }

    // Takes in an X value, does something with it, 
    // and returns the resulting X and Y values
    protected abstract double[] handlePoint(double x);
}

Итак LinearLineCalculator просто вычисляет соответствующее значение Y с помощью уравнения, тогда как PolarLineCalculator вычисляет радиус из уравнения и значение X и преобразует его в полярные координаты (в этом случае X действует как θ в градусах или радианах). *Затем 1009 *

LineCalculator вычисляет строку в некотором роде «бесплатно для всех», где потоки, вычисляющие строку, принимают и вычисляют значения X и Y так быстро, как могут, и сообщают о них в базовый класс.Затем базовый класс имеет дело с построением линии из данных, вычисленных потоками.

Моя проблема в том, что я реализовал модифицированную версию, где она вычисляется последовательным образом, где базовый класс блокируется накаждый поток, пока не получит первое значение.Затем он ждет второго упорядоченного значения и т. Д., Позволяя ему построить линию на лету.

Эта модель наследования работает отлично, потому что я смог изменить базовый класс, не изменяя ни одного из наследников.и это все еще работает.Но я хочу иметь возможность взаимозаменяемо переключать реализации, например, для некоторых строк, вычислять его стиль «бесплатно для всех», а для некоторых строк вычислять его последовательно.

У меня вопрос есть шаблон или дизайн, который позволяет мне изменить реализацию базового класса, но сохранить реализацию суперкласса, не нарушая принцип DRY?

1 Ответ

5 голосов
/ 23 мая 2010

Звучит так, будто ты действительно хочешь сочинения, а не наследования.

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

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