Java, ist es möglich, ein Objekt von der Unterklasse in ein Objekt von der Oberklasse zu konvertieren

8

Ich habe zwei Klassen Schüler und Tutor. Tutor ist im Grunde ein Student (Tutor erweitert Student), der factoryID hat. Sobald sein Vertrag abgeschlossen ist, ist er wieder Student. Kann ich ihn irgendwie zurück in seine "vorherige" Studentenrolle verwandeln?

    
vedran 01.11.2011, 21:34
quelle

8 Antworten

5

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.

%Vor%

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 .

    
Brad 01.11.2011, 21:55
quelle
4

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.

    
Alexander Pogrebnyak 01.11.2011 21:55
quelle
3

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:

  • Geben Sie 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.
  • Wenn es wichtig ist, dass die tatsächliche Instanz beibehalten wird, anstatt eine Kopie zu erstellen (vielleicht haben Sie Referenzen überall gespeichert), ist es am besten, die Rolle von der Klasse zu trennen. Machen Sie eine FacultyMember -Klasse oder etwas und drehen Sie Student und Tutor in Rollen. Dann kannst du später die Rolle von FacultyMember ändern.
G_H 01.11.2011 21:39
quelle
2

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.

    
StriplingWarrior 01.11.2011 21:38
quelle
1

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.

    
Ian Dallas 01.11.2011 21:40
quelle
1

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.

    
jayunit100 01.11.2011 21:46
quelle
1
  1. 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.

  2. 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.

  3. 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.

Desmond Zhou 01.11.2011 21:40
quelle
1

Sie können den Objekttyp in Java nicht ändern. Wahrscheinlich der einfachste Weg, um Sie zu erreichen, ist, alle Parameter von Tutor in ein neues Student-Objekt zu klonen.

    
Lycha 01.11.2011 21:39
quelle

Tags und Links