У меня проблема с наследованием, которое я делаю.По сути, у меня есть абстрактный класс 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?