Мне было интересно, можно ли заставить клиентов обеспечить реализацию внутреннего класса, когда они определяют новую реализацию внешнего класса.Принудительный клиент для обеспечения реализации внутреннего класса при расширении внешнего класса
Чтобы объяснить ситуацию лучше: Я абстрактный класс
public abstract class ImmutablePolynomial implements Iterable {
protected int degree;
static ImmutablePolynomial sum(ImmutablePolynomial x, ImmutablePolynomial y) {
.... Some Implementation using an iterator over terms and a return statement....
}
public abstract TermIterator iterator();
Here I want an innerclass (TermIterator) extending Iterator that must be implemented
if you extend ImmutablePolynomial.
Теперь клиент может обеспечить реализацию в ImmutablePolynomial, используя специфические для структуры данных, например, уменьшить использование памяти, расширяя этот класс. Как заставить клиента также обеспечить реализацию Interclass Implementing Iterator, чтобы сумма статического метода в ImmutablePolynomial также работала с реализацией, предоставляемой клиентом?
Также, если это плохая идея/антипаттерн/есть лучшая альтернатива, скажите мне об этом. Я делаю это, чтобы улучшить свое кодирование.
Edit 1: удалить поле
защищенных термины Коллекции
, как в посоветовал комментарии. Edit 2: сделать метод
итератор()
аннотация как посоветовали в комментариях
Нет, нет способа сделать это. Зачем вам нужно использовать другую итераторскую реализацию? –
Почему бы не сделать метод iterator() абстрактным? Подклассы должны это реализовать. Также сделайте TermIterator интерфейсом, и вы настроены. Однако мне не нравится, что у вас есть поле «Collection terms»; почему бы не позволить подклассу решить, как это сделать? –
@LouisWasserman Итератор должен переходить через члены в порядке убывания экспонентов. Итак, если у вас есть 4x^2 + 3x + 1, он должен сначала дать термин 4X^2, затем 3x, а затем 1. Это из-за суммы метода – Ph03n1x