外部クラスの新しい実装を定義するときにクライアントが内部クラスの実装を提供できるかどうかは疑問でした。より良い状況を説明するために外部クラスを拡張するときにクライアントが内部クラスの実装を提供するように強制する
:私は
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:削除フィールド
、。 編集2:コメントでadvicedされるようにする方法保護されたコレクションに関してコメントでadvicedされるよう
イテレータ()
抽象
いいえ、これを行う方法はありません。異なるイテレータ実装を使用する必要があるのはなぜですか? –
iterator()メソッドを抽象化してみませんか?サブクラスはそれを実装する必要があります。また、TermIteratorをインターフェイスにして、設定します。しかし、私はあなたが 'Collection terms'フィールドを持っているのが好きではありません。サブクラスがそれを行う方法を決めるのをなぜ許さないのですか? –
@LouisWassermanイテレータは、指数の降順でタームを上書きすることになっています。したがって、4x^2 + 3x + 1の場合は、最初に4X^2、3x、そして1を与える必要があります。これはメソッドの合計が – Ph03n1x