Es ist vollkommen normal, diese beiden zusammen zu verwenden. Betrachten Sie zum Beispiel AbstractList
(Implementieren List
) und AbstractMap
(Implementieren Map
) im JDK.
Meine Kurzschlussreaktion wäre zu haben gewesen hat die abstrakte Klasse die Schnittstelle implementieren und dann leiten die konkreten Klassen daraus:
abstract class Base implements TheInterface {
/* ...shared methods... */
}
class Concrete1 extends Base { }
class Concrete1 extends Base { }
Aber Ihre Frage die andere Möglichkeit erhöht, machte mich denken, und ich kann nicht viel eines Arguments sehen vor, dass das so tun:
abstract class Base {
/* ...shared methods... */
}
class Concrete1 extends Base implements TheInterface { }
class Concrete1 extends Base implements TheInterface { }
des weiteren kann ich ein Argument für es auf diese Weise tun, und zwar sehen, dass es die Kopplung zwischen dem abstrakten c entfernt Mädchen und die Schnittstelle. Wenn Sie eine andere Klasse haben, die die Funktionalität Base
bietet, aber nicht benötigt, um die Schnittstelle zu implementieren, haben Sie die Flexibilität, das zu tun.
Es gibt auch eine dritte Option: Zusammensetzung. Sie können nicht eine abstrakte Klasse haben überhaupt, sondern die zahlreichen konkreten Klassen haben, die die Schnittstelle Verwendung eine gemeinsame Hilfsklasse bei der Umsetzung implementieren:
class Helper {
/* ...shared methods... */
}
class Concrete1 implements TheInterface {
/* ...uses instance of Helper */
}
class Concrete1 implements TheInterface {
/* ...uses instance of Helper */
}
Dies hat die gleiche Flexibilität, in einer anderen Form.
Kein Grund, warum sie nicht sein sollten –
Nop, überhaupt nicht. In der Tat ist das meiste, was ich mache, genau so. –