2016-04-05 6 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の実装を提供することができますが、このクラスを拡張することで、メモリ使用量を削減します。 ImmutablePolynomialの静的メソッドの合計がクライアントによって提供される実装でも機能するように、Innerclass Implementing Iteratorの実装をクライアントにも提供するにはどうすればよいですか?

また、これが悪いアイデア/反パターン/もっと良い選択肢がある場合は教えてください。コーディングを改善するためにこれをやっています。

編集1:削除フィールド

保護されたコレクションに関してコメントでadvicedされるよう

、。 編集2:コメントでadvicedされるようにする方法

イテレータ()

抽象

+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には、イテレータに依存する具体的な方法がある限り、特定の実装ではなくインタフェースに対して実装します。とにかく、サブクラスが独自の実装を提供することを許可するだけでなく、必要とする場合は、これは唯一無礼なアプローチです。

関連する問題