Как изменить существующий класс Java для перегрузки оператора в Groovy? - PullRequest
2 голосов
/ 14 сентября 2010

Я реализую несколько математических классов и впервые нахожу проблемы с Java (громоздкий и дублированный код), которые я действительно не могу преодолеть с помощью умного кодирования.Перегрузка операторов была бы ДЕЙСТВИТЕЛЬНО удобной, и есть несколько других вещей, которые Groovy может сделать намного лучше (я могу также попробовать Scala в какой-то момент).

Так что я все еще пишу основные классы (Прямо сейчасComplex и Matrix) в Java, но я собираюсь использовать их из Groovy.

Я изменил имена некоторых методов (.add), чтобы воспользоваться перегрузкой операторов (.plus).

Теперь мои классы очень хорошо взаимодействуют с базовым классом "Число", поэтому я могу использовать:

complex.add(number); //or 
complex = complex + number;

и получить удивительный ответ, но я не могу использовать:

complex = number + complex

так как число не понимает .add (Число), и даже если бы оно это понимало, оно не знало бы, как обращаться с Числом, если оно оказалось сложным.

Могу ли я написать число.plus(сложный) и добавить его в номер интерфейса?Код на самом деле был бы довольно простым, я мог бы просто перевернуть его:

Number plus(complex) {
     return complex.plus(this);
}

Это сработало бы для всего с номером типа, но я не знаю, сможет ли Groovy перенести это на числовой интерфейс после факта,(Кроме того, Number и Complex написаны на Java, поэтому я рассматриваю это как надстройку для groovy).

Любой другой совет?Должен ли я просто сдаться и выучить Scala?

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

1 Ответ

2 голосов
/ 15 сентября 2010

Вы можете добавить требуемые методы как замыкания в метакласс Number.

Например (с использованием коммутативности сложения):

Number.metaClass.plus << { Complex complex ->
    complex.plus(delegate)
}

После этого любой Number подкласс также может быть в левой части уравнения.Убедитесь, что вы используете оператор добавления <<, чтобы избежать путаницы с другими перегруженными плюс метаметодами.На номер ссылаются как delegate вместо this, так как это замыкание.

...