2012-09-02 11 views
5

Ich merke, dass, wenn ich eine Methode als abstrakt definieren, die Signatur der untergeordneten Klassen damit kompatibel sein muss. Dies beraubt mich der Gelegenheit, die Typüberprüfung in der Unterschrift der Kindklasse zu verwenden.PHP abstrakte Methode im Vergleich zu Standardmethode

Wenn ich die übergeordnete Methode als eine konkrete Methode mit einer Standardimplementierung definiere, kann ich dann die übergeordnete Methode überschreiben, ohne ihre Schnittstelle zu beachten.

In Fällen, in denen eine geeignete Standardimplementierung existiert, bin ich geneigt, den zweiten Ansatz zu verwenden. Aber lasse ich mich in Schwierigkeiten hineinfallen?

Es scheint mir nur seltsam, dass die Verwendung von ‚abstrakt‘, so einschränkend sein kann, so möchte ich wissen, ob ich etwas fehlt ...

Hinweis - ich sehe, dass ähnliche Fragen gestellt wurden in Bezug auf andere Sprachen, aber nicht so sehr PHP.

+4

Eigentlich ist es nur eine gute Praxis, dass Sie die Schnittstelle respektieren. http://en.wikipedia.org/wiki/Liskov_substitution_principle – zerkms

Antwort

7

Dies ist eine sehr weit gefasste Frage, aber in wenigen Worten:

Wenn Sie Schnittstellen nicht respektieren - es die fragile Design schafft, denn auch wenn per Definition jedes Kind alle Vorfahren Schnittstellen unterstützen sollte - Sie brechen es, bu definiert inkompatible Schnittstellen.

Es ist ein gutes Gesetz darüber: http://en.wikipedia.org/wiki/Liskov_substitution_principle

Außerdem ist es oft ein Zeichen, dass Sie Delegation über Vererbung vorziehen sollte.

4

Die Schnittstelle (oder abstrakte Klasse) erzwingt Konsistenz mit Ihren Klassen. Es ist ein Vertrag zwischen dir und der Klasse, von der du erbst. Diese Konsistenz ist der Schlüssel, wenn mehrere Personen Code schreiben und Sie Klassen zuverlässig austauschen möchten.