Ihre Klassen scheinen normale (geschäftliche) Objekttypen darzustellen, wie sie in einem UML-Klassendiagramm definiert sind, das ein Datenmodell für eine App darstellt. In Ihrem Beispiel ist es natürlich, die Klassenhierarchie zu betrachten, die durch die Stammklasse Person
mit zwei Unterklassen Professor
und Student
im Datenmodell gebildet wird. Wenn nun ein solches Datenmodell (mit Unterklassen und/oder Beziehungen/Assoziationen zwischen Klassen) in einem Framework implementiert werden soll, stellt sich die Frage, wie entsprechende Modellklassen (auch "Entitätsklassen" genannt) definiert werden und die Antwort davon abhängt die Unterstützung des Frameworks für diese Konzepte.
Wenn Sie in Ihrer App mit einer Klassenhierarchie umgehen müssen und Ihr OO-Framework die Vererbung/Spezialisierung zwischen Modell-/Entitätsklassen unterstützt, besteht die Hauptproblematik darin, die Klassenhierarchie einer Reihe von Tabellen zuzuordnen das zugrundeliegende SQL DBMS als Teil des Object-Relational Mapping (ORM).
Im Datenmodell würden Sie keine Schnittstellen verwenden, da sie ein OO-Programmierkonzept und kein Datensemantikkonzept sind. Im Datenmodell können Sie jedoch Person als abstrakte Klasse definieren, was bedeutet, dass sie keine direkte Instanz hat und nur dazu dient, Merkmale (Eigenschaften, Methoden und Einschränkungen) zu definieren, die von Unterklassen geerbt werden. Übrigens würde diese Annahme/Entscheidung bedeuten, dass es keine anderen Instanzen von Person
gibt, mit Ausnahme von Studenten und Professoren.
Wenn Ihr Rahmen (zum Beispiel Symfony) unterstützt keine Vererbung von abstrakten Klassen, aber eine gewisse Form von Schnittstellen, dann können Sie eine Schnittstelle verwenden, so etwas wie eine abstrakte Klasse definiert, abstrakte Methoden nur zu bekommen. Eine Schnittstelle Person
würde Getter/Setter für firstname
und lastName
definieren.
Da in vielen Fällen, und auch bei Ihrem einfachen Beispiel, die gegebene Klassenhierarchie ziemlich einfach ist, ist es vorzuziehen, die Sublinkbeziehungen zu eliminieren und die konzeptionelle Klassenhierarchie des Datenmodells auf eine einfache Menge von Klassen zu reduzieren Verwenden Sie die class hierarchy merge design pattern. Dies vermeidet den gesamten Overhead, der beim Definieren von Schnittstellen und bei der Pflege der Beziehungen zwischen ihnen und den Klassen, die sie implementieren, erforderlich ist. Dies entspricht der Beibehaltung der Klassenhierarchie in Ihren Modell-/Entitätsklassen und der Verwendung des ORM-Schemas für die Ein-Tabellen-Vererbung.
Ich denke, das ist Quatsch (Entschuldigung für die harten Worte). Person ist keine Schnittstelle. Es ist eine einfache (vielleicht abstrakte) Klasse. Eine Schnittstelle benötigt Methoden, keine Attribute, da sie Funktionalität bietet. –
Danke für die Klarstellung, die hilfreich ist. Es war nur ein einfaches Diagramm, um die Idee zu vermitteln, aber in meinem tatsächlichen Fall habe ich auch Methoden in "Person". Also ist es richtig zu sagen, dass eine Schnittstelle eine "abstrakte Klasse + Methoden" wäre? – Bendy
Ich denke du kannst das sagen :-) –