Я хочу запрограммировать арифметику для объектов, которые могут иметь различную природу и быть определены позже (действительное число, комплексные числа, матрицы, ...).Как только арифметика будет реализована, я все еще могу добавлять новые типы.Общей особенностью является то, что все они характеризуются набором действительных чисел (double []), но реализация для сложения, умножения и т. Д. Отличается.
Я связал определение interface
:
interface GeneralNumber
{
void set(double[] z)
double element(int i);
GeneralNumber addition(GeneralNumber a, GeneralNumber b);
}
Тогда:
public class ComplexNumber implements GeneralNumber
{
double[] k;
@Override
public void set(double[] z)
{
k[0]=z[0];
k[1]=z[1];
}
@Override
public double element(int i)
{
return k[i];
}
@Override
GeneralNumber addition(GeneralNumber a, GeneralNumber b)
{
double aR = a.element(0);
double aI = a.element(1);
double bR = b.element(0);
double bI = b.element(1);
double[] c = {aR+bR,aI+bI};
GeneralNumber result = new ComplexNumber();
result.set(c);
return result;
}
В третьем классе, когда я программирую некоторые алгебраические операции на GeneralNumber
, я сталкиваюсь с проблемами.Представьте себе, что в третьем классе я вызываю метод computeSomething
с ComplexNumber
объектами (поэтому информация tpye там есть ) и пытается сделать что-то подобное (что не работает)
GeneralNumber computeSomething(GeneralNumber a, GeneralNumber b)
{
GeneralNumber c = GeneralNumber.addition(a,b)
....
}
Я бы хотел, чтобы Java распознала входные данные как ComplexNumber
и использовала метод addition
из ComplexNumber
, как если бы это был статический метод.
Иглы говорят, чтоЯ не могу создать новые GeneralNumber
экземпляры, потому что Java не знает, какой из них (я могу только попытаться клонировать существующие GeneralNumbers
и затем работать с ними ..).Должен быть какой-то элегантный способ ... Например, я могу захотеть сделать что-то вроде
GeneralNumber unity = new GeneralNumber.generateFromDouble(1.0);
, потому что 1.0 (или, как правило, действительное число) очень часто можно легко обобщить для более общего объекта единства (единичная матрица, матрица с числом по диагонали и т. д.).Ясно, что «тип» «GeneralNumber» должен где-то появляться ... но где, чтобы весь подход был элегантным?Быть хорошей практикой?
Я пытался использовать абстрактный класс, но дела обстоят не лучше, я все же сталкиваюсь в основном с теми же проблемами.При попытке работать с GeneralNumber
в computeSomething
я не могу использовать static
:
GeneralNumber.addition(a,b)
В GeneralNumber
это не реализовано, а в ComplexNumber
это не может быть static
.
Может быть, здесь помогут дженерики Java ... Я размышлял, не найдя решения.
Вопрос очевиден:
Как программировать арифметику, которая подходит для разных объектов, каждый объект (тип) реализует свою собственную версию операции (например, сложение, умножение) по-своемукоторый выглядит как static
?