2016-04-05 11 views
0

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

Чтобы объяснить ситуацию лучше: Я абстрактный класс

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: сделать метод

итератор()

аннотация как посоветовали в комментариях

+0

Нет, нет способа сделать это. Зачем вам нужно использовать другую итераторскую реализацию? –

+2

Почему бы не сделать метод iterator() абстрактным? Подклассы должны это реализовать. Также сделайте TermIterator интерфейсом, и вы настроены. Однако мне не нравится, что у вас есть поле «Collection terms»; почему бы не позволить подклассу решить, как это сделать? –

+0

@LouisWasserman Итератор должен переходить через члены в порядке убывания экспонентов. Итак, если у вас есть 4x^2 + 3x + 1, он должен сначала дать термин 4X^2, затем 3x, а затем 1. Это из-за суммы метода – Ph03n1x

ответ

0

Учитывая, что ImmutablePolynomial класс является абстрактным, так что вы никогда не будете иметь объект, класс это ImmutablePolynomial, и вам не нужны экземпляры подклассов ImmutablePolynomial для использования класса ImmutablePolynomial.TermIterator, когда будет ImmutablePolynomial.TermIteratorкогда-либо? Бессмысленно реализовывать его как внутренний класс.

Как @Tassos в комментариях, объявите TermIterator как интерфейс; это может быть вложен в класс ImmutablePolynomial или нет, как вы предпочитаете. Также сделайте реферат ImmutablePolynomial.iterator().

В той степени, в которой у вас есть какие-либо конкретные методы в ImmutablePolynomial, которые полагаются на итератор, реализуют их против интерфейса, а не против какой-либо конкретной реализации. В любом случае это единственный разумный подход, когда вы не только разрешаете, но и требуете, чтобы подклассы предоставляли свою собственную реализацию.

 Смежные вопросы

  • Нет связанных вопросов^_^