Frage

Ich habe eine Schnittstelle A, für die ich ein paar verschiedene liefern müssen Implementierungen. Jedoch teilen diese Implementierungen einige Hilfsmethoden, so Ich zog diese Methoden zu einer abstrakten Basisklasse.

Interface A {
    void doX();
}

abstract Class B implements A {
    protected void commonY() {
        // ...
    }

    @Override
    public abstract void doX();
}

Class C extends B {
    @Override
    public void doX() {
        // ...
    }
}

Class D extends B {
    @Override
    public void doX() {
        // ...
    }
}

Mein Code funktioniert wie erwartet, aber ich habe ein paar Fragen:

  • Soll ich die abstrakte Methode doX () in der Klasse B zu erklären? Warum (nicht)?

  • Soll ich ausdrücklich auch erklären "implementiert A" auf den Klassen C und D? Warum (nicht)?

War es hilfreich?

Lösung

Ich denke, es wäre besser, es zu tun, wie folgt:

Interface A {
        void doX();
}

abstract Class B {
        protected void commonY() {
                // ...
        }
}

Class C extends B implements A{

        public void doX() {
                // ...
        }
}

Class D extends B implements A{

        public void doX() {
                // ...
        }
}

Sie sollten nicht die Schnittstelle mischen (Signatur von Methoden) bei der Umsetzung.

Andere Tipps

  • Soll ich die abstrakte Methode doX () in der Klasse B zu erklären? Warum (nicht)?

Nein. Es ist eine abstrakte Klasse - die Schnittstelle definiert, bedeutet, dass alle Unterklassen diese Methoden implementieren müssen. Mit anderen Worten, es ist überflüssig.

  • Sollte ich erklären ausdrücklich auch „implementiert A“ auf der Klassen C und D? Warum (nicht)?

Nein, wieder -. Weil die Superklasse (Abstract Basisklasse) diese Schnittstelle implementiert, werden Ihre konkreten Subklassen garantiert, dass die Schnittstelle implementieren

Ich werde einfach in der anderen Option werfen.

Drehen abstrakte Klasse B in eine AUtil Klasse, die nicht A. Die Methodensignaturen nicht implementieren kann ein zusätzliches Argument vom Typ A erfordert, mit zu arbeiten.

C und D A implementieren und eine AUtil intern instanziiert. Dies erlaubt C und D auf andere Klassen zu erweitern.

ich mit JeeBee einig: Sehen Sie Ihre Hilfsmethoden irgendwo anders als eine abstrakte Basisklasse implementieren.

Wenn Ihre Hilfsmethode CommonY () existiert nur in der abstrakten Basisklasse B, alle Klassen, die Schnittstelle A implementieren müssen auch Basisklasse B erstrecken, um die Vorteile dieser Implementierung von CommonY zu nehmen (). Aber Sie vielleicht nicht immer wollen gezwungen werden, Klasse B zu verlängern

Auch was ist, wenn Sie die Implementierung von CommonY () in der Zukunft ändern? Sie werden dann viele Implementierungen von Interface A. beeinflussen Aber wenn Sie alle nicht diesen Implementierungen A-Schnittstelle steuern, kann man ihre Funktionalität beeinflussen (in einem schlechten Weg), ohne es zu wollen.

eine abstrakte Basisklasse in dieser Situation verwendet eine gewisse Flexibilität ohne dass Sie etwas dafür kann einfach wegzunehmen.

Eine abstrakte Klasse eine Schnittstelle implementiert, müssen diese Schnittstelle implementieren. Insbesondere muss es eine öffentliche Methode für jede Methode-Namens- und Unterschrift in dieser Schnittstelle angegeben hat.

Die Vererbung ist transitiv. Sie brauchen nicht die Klasse C implementiert Schnittstelle A zu schreiben, wenn Klasse C Klasse B abgeleitet, die jedoch Schnittstelle A. implementiert, gibt es auch nicht viel Schaden ist.

Ich würde nicht doX() in B erklären und nicht hinzufügen "implements A" auf C und D, weil Sie sollten sich nicht wiederholen .

Die abstrakte doX() in B fügt nichts, da es bereits durch „implements A“ angegeben ist. Das gleiche gilt für das Hinzufügen von „implements AC und D.

Die einzig mögliche Verwendung für diese Klauseln Dokumentation wäre: Wenn Sie es sehr deutlich machen wollen, dass C (oder D) ist-ein A, dann könnte man die implements hinzufügen, aber Sie sollten sich bewusst sein, dass es wirklich doesn‘ t Angelegenheit an den Compiler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top