Wie funktioniert die Java-Vererbung, wenn innere Klassen beteiligt sind?

8

Ich habe Probleme zu verstehen, wie Vererbung in Java funktioniert, wenn innere Klassen vorhanden sind. Ich arbeite gerade an etwas, wo eine Kindklasse die Funktionalität der inneren Klasse ihrer Eltern leicht ändern muss. Ich habe unten ein einfacheres, analoges Beispiel entwickelt.

Ich habe erwartet, dass dieser Code "Ich bin eine ChildClass.InnerClass", aber stattdessen druckt "Ich bin eine ParentClass.InnerClass". Warum ist das? Auch wenn ich das Obj-Objekt in main ändere Um vom Typ ChildClass zu sein, ändert sich die Ausgabe in "Ich bin eine ChildClass.InnerClass". Warum ist das?

Was ist im Allgemeinen die empfohlene Methode, um das Verhalten des inneren Objekts einer Elternklasse zu ändern?

%Vor%     
martega 23.10.2012, 23:02
quelle

3 Antworten

6

Variable werden nicht wie Methoden überschrieben.

In deinem Aufruf hast du x als Child 's erwartet, aber nicht weil x eine Variable ist, keine Methode.

Aber Achtung: Ihr Referenztyp ist ParentClass , so dass obj.x auf das Attribut ParentClass InnerClass zeigt, obwohl die tatsächliche Instanz hinter parentClass ein ChildClass ist!

Um Ihren erwarteten Satz anzuzeigen, müssen Sie den Typ Verweis auf ChildClass :

ändern %Vor%

Um das Konzept besser zu verstehen, versuchen Sie, in den Klassen ParentClass und ChildClass eine Methode zu definieren:

%Vor%

und make x private.

, so dass "override concept" gilt.

Ihr letzter Aufruf wäre in diesem Fall:

%Vor%

Um das Verhalten der inneren Klassen zu ändern, denken Sie an Template-Methode Muster oder besser: Strategie-Muster (seit mehr Respekt für DIP)

    
Mik378 23.10.2012, 23:07
quelle
3

Entfernen Sie die Deklaration

%Vor%

aus der Kindklasse. Sie haben also nur ein x und werden im Konstruktor der Kindklasse neu zugewiesen. Was bedeutet ein x (bezieht sich auf das Objekt in Kind Ctor erstellt).

Es versteckt den einen in der Elternklasse. Aus diesem Grund haben Sie zwei Felder, die sich auf zwei verschiedene Objekte beziehen. Und wegen der statischen (Kompilierungszeit oder frühe) Bindung im Falle von Variablen,

%Vor%

und

%Vor%     
Bhesh Gurung 23.10.2012 23:11
quelle
1
  

Im Allgemeinen, was ist die empfohlene Methode, um das Verhalten eines zu ändern?   Oberes Objekt des übergeordneten Objekts der Elternklasse?

Ich würde empfehlen, mit einem weniger gewundenen Design zu beginnen. Eine untergeordnete Klasse sollte das Verhalten ihres übergeordneten Elements ändern, indem sie ihre Methoden überschreibt. Daher würde ich einfach die Factory-Methode newInnerClass() hinzufügen, um die Erstellung dieser Abhängigkeit zu überschreiben und dieses Objekt an der Spitze der Klassenhierarchie zu verwalten.

Dies wäre flexibler als das, was Sie vorschlagen, denn newInnerClass() könnte eine Klasse instanziieren, die überall definiert ist, solange sie über die richtige Schnittstelle verfügt.

    
millimoose 23.10.2012 23:31
quelle