Ich frage mich, ob es möglich ist, Clients zu zwingen, eine Implementierung einer inneren Klasse bereitzustellen, wenn sie eine neue Implementierung der äußeren Klasse definieren.Force Client, um die Implementierung einer inneren Klasse beim Erweitern einer äußeren Klasse
Um die Situation besser zu erklären: Ich habe eine abstrakte Klasse
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.
Jetzt kann der Kunde eine Implementierung eines ImmutablePolynomial bereitzustellen, um eine bestimmte Datenstruktur unter Verwendung von zB Speicherverbrauch zu reduzieren, indem Sie diese Klasse erweitern. Wie kann ich den Client zwingen, auch eine Implementierung eines Innerclass Implementing Iterator bereitzustellen, sodass die Summe der statischen Methode in ImmutablePolynomial auch mit der vom Client bereitgestellten Implementierung funktioniert?
Auch wenn das eine schlechte Idee/Antipattern ist/gibt es eine bessere Alternative bitte sag es mir. Ich mache das, um meine Programmierung zu verbessern.
Edit 1: Entfernen Sie das Feld
geschützt Sammlung Begriffe
, wie in den Kommentaren adviced wird. Edit 2: make Methode
iterator()
abstrakt wie in den Kommentaren adviced ist
Nein, es gibt keine Möglichkeit, dies zu tun. Warum benötigen Sie eine andere Iterator-Implementierung? –
Warum nicht die Iterator() -Methode abstrakt machen? Unterklassen müssen es implementieren. Machen Sie TermIterator zu einer Schnittstelle und Sie sind fertig. Ich mag jedoch nicht, dass Sie das Feld "Sammlungsbedingungen" haben; Warum sollte die Unterklasse nicht entscheiden, wie es geht? –
@LouisWasserman Der Iterator soll die Ausdrücke in absteigender Reihenfolge der Exponenten durchlaufen. Wenn Sie also 4x^2 + 3x + 1 haben, müssen Sie zuerst den Ausdruck 4X^2, dann 3x und dann 1 eingeben. Dies liegt an der Methode sum – Ph03n1x