Was Sie hier wirklich tun möchten, ist die Komposition und nicht die Vererbung . Behalten Sie alle Ihre Objekte als Typ Student
und weisen Sie dann das Verhalten einer TutorRole
temporär so zu, wie es für jede Instanz von Student
erforderlich ist.
Bei diesem Design enthält Ihre Student
-Klasse eine Eigenschaft (Elementvariable) vom Typ TutorRole
, die Sie zur Laufzeit hinzufügen oder entfernen können. Durch das Hinzufügen einer isTutor()
-Methode können Sie klar und übersichtlich feststellen, ob ein Student ein Tutor zur Laufzeit ist.
Die TutorRole
-Klasse kapselt das Verhalten (d. h. Methoden) eines Tutors.
Ein alternativer Ansatz besteht darin, dass eine Tutor
-Klasse einen Verweis auf ein Student
-Objekt enthält, aber es hängt davon ab, wie Sie mit den Objekten Student und Tutor interagieren wollen, auf welchem Weg Sie das programmieren wollen .
Ich denke, das schreit Containment und Interface-Programmierung.
Wie wäre es damit:
%Vor%Auf diese Weise bleibt Ihr Schüler ein Schüler, auch wenn er in die Tutor-Position wechselt. Wenn die Amtszeit des Lehrers abläuft, guckst du einfach den Tutor-Datensatz.
Der Schülerbericht wird andererseits weiterhin in den zentralen Diensten verfügbar sein.
Sobald Sie eine Instanz eines Typs erstellt haben (z. B. Tutor
), ist dies der Laufzeittyp, den diese Instanz haben soll. Dies kann nicht mehr geändert werden.
Einige Alternativen:
Student
einen Konstruktor an, der eine weitere Student
Instanz akzeptiert und über die relevanten Felder kopiert. Ein sogenannter Kopierkonstruktor. Auf diese Weise können Sie einfach eine neue Student
-Instanz basierend auf Ihrer Tutor
erstellen und diese stattdessen verwenden. FacultyMember
-Klasse oder etwas und drehen Sie Student
und Tutor
in Rollen. Dann kannst du später die Rolle von FacultyMember
ändern. Sie können den Tutor als Schüler umwandeln, so dass Ihr Code ihn zur Kompilierzeit als solchen behandelt, aber das Objekt bleibt ein Tutor, so dass der Aufruf der überladenen Methoden die Version der Tutor-Klasse verursacht genannt.
Die Art der "Konvertierung", nach der Sie suchen, besteht nur darin, ein neues Student-Objekt zu erstellen und ihm alle Eigenschaften zu geben, die der Tutor hat.
Da Sie feststellen, dass Sie diese Konvertierung durchführen müssen, sollten Sie die Klassenstruktur überdenken. Zum Beispiel sollten sowohl Schüler als auch Tutoren wirklich nur Personen sein, und jede Person kann die Rolle eines Schülers oder Lehrers haben.
Sie könnten einfach eine Methode wie TutorToStudent()
auf Tutor schreiben und einen neuen Schüler von Ihrem Tutor erstellen. Wenn du dich beteiligst, erhältst du das Objekt als Tutor.
Sie könnten auch in Erwägung ziehen, in diesem Fall auf die Erbschaft zu verzichten und nur eine Flagge zu haben, die angibt, ob dieser Student ein Tutor ist oder nicht.
Es gibt keine Möglichkeit, ihn zu einem Schüler "umzuwandeln", er ist ein Tutor, und ein Tutor IST bereits ein Student.
Es kann jedoch sein, dass der Zugriff auf dieses Objekt generisch ist, sodass Sie nur die Methode student verwenden. Dafür gibt es mehrere Idiome in Java.
1) Sie können die Student-API ausschließlich in Ihrem Code verwenden, mit Ausnahme des Tutor-Teils.
2) Sie können eine "toStudent / toTutor" -Methode für Ihre Objekte verwenden, die es ihnen ermöglicht, rollenspezifische Objekte zurückzugeben.
// Meine Präferenz 3) Sie können Schnittstellen verwenden. Lassen Sie Tutor und Student beide Interfaces sein und bauen Sie Ihre Objekte mithilfe der Schnittstellenimplementierung auf. Wenn Sie auf Objekte mit minimalen Schnittstellen und nicht auf schwergewichtige Vererbungsmuster verweisen, wird Ihr Code in Zukunft wahrscheinlich besser skaliert.
Sie können einen neuen Schüler mit genau den gleichen Informationen wie der Lehrer erstellen und das ursprüngliche Objekt verwerfen. Entweder mit einem Copy-Konstruktor Student(Student original)
oder einer Student toStudent()
Methode Dies ist der schnelle und schmutzige Weg.
Statt einen Tutor direkt zu erweitern, macht man die Tutor
spezifischen Daten und Verhaltensweisen zu einem Dekorateur Oder noch besser, machen Sie Tutor
und Student
Decorators eines People
-Objekts, das alle enthält. Dies ist einer der richtigen Wege, dies zu tun.
Machen Sie die Tutor
und Student
zu einer enum Type
und halten Sie dieses Feld in People
, das ist einfacher, aber weniger erweiterbar als das oben, es hängt wirklich von der Art der Unterschiede zwischen Tutor ab und Student.
Tags und Links java object subclass superclass