2011-01-15 4 views
10

Wie kann ich im folgenden Beispiel von C auf die Methode method() der Klasse A zugreifen?Wie greife ich auf die Super-Super-Klasse in Java zu? [Mini-Beispiel innen]

class A { 
    public void method() { } 
} 

class B extends A{ 
    public void method() { } 
} 

class C extends B{ 
    public void method() { } 

    void test() { 
     method();   // C.method() 
     super.method(); // B.method() 
     C.super.method(); // B.method() 
     B.super.method(); // ERROR <- What I want to know 
    } 
} 

Der Fehler, den ich bekommen habe ist

Keine umschließenden Instanz des Typs B zugänglich in Umfang ist

Antwort: Nein, das ist nicht möglich. Java erlaubt es nicht. Similar question.

+2

Siehe Jon Skeets Antwort auf http: // stackoverflow.com/questions/586363/warum-ist-super-super-methode-nicht-erlaubt-in-java – BoltClock

+0

Ich bin überrascht, dass die Frage nicht in den verwandten Fragen erschien, als ich es schrieb. Meine Antwort ist da. +1 –

Antwort

17

Sie können nicht - und sehr bewusst. Es würde die Kapselung verletzen. Sie würden das Überspringen was B.method tun will - möglicherweise Argumente Validierung (vorausgesetzt, es welche gibt), Durchsetzung von Invarianten usw.

Wie man B erwarten konnte eine konsistente Sicht auf seine Welt, wenn eine abgeleitete Klasse halten kann einfach überspringen was auch immer Verhalten ist definiert?

Wenn das Verhalten B nicht für C geeignet ist, sollte es nicht erweitert werden. Versuchen Sie nicht, die Vererbung so zu missbrauchen.

+3

Es geht nicht darum, ob ich sollte oder nicht. Ich wollte wissen, ob es möglich ist, das ist alles. Aber ich sehe es nicht. –

+5

Es ist nicht die Aufgabe der Sprache, mich daran zu hindern, meine Arbeit zu machen (Bugs in anderem Code zu bearbeiten, die wir nicht reparieren können). –

+7

@GlennMaynard: Dann schlage ich vor, Sie ändern die Sprache - vielleicht zu einem ohne Einschränkungen überhaupt ... kein Konzept von privat vs öffentlich, keine Vorstellung von Kapselung. Jede Einschränkung hat Zeiten, in denen es die Dinge schwieriger macht - aber der Gesamteffekt ist positiv. –

1

Sie sollten nicht. Wenn Sie auf die Methoden in A zugreifen möchten, erweitern Sie von A statt B.

Wenn BA erweitert, wird davon ausgegangen, dass das zugrundeliegende A-Objekt nicht auf andere Weise manipuliert wird, als es selbst tut. Wenn Sie also direkt auf die Methoden A zugreifen, können Sie die Funktionen B unterbrechen.

Stellen Sie sich vor, Sie haben beispielsweise eine Klasse, die eine Liste implementiert, MyList. Nun stellen Sie sich vor, wir erweitern diese Liste um eine andere Klasse namens MyCountingList, die die Methoden add() und remove() überschreibt, um die Elemente zu zählen, die hinzugefügt/entfernt werden. Wenn man die add() Methode MyCountingList umgeht, hat man stattdessen mit der einen MyList die Zählfunktion von MyCountingList gebrochen.

Kurz gesagt, einfach nicht.

+0

Danke für die Erklärung. Ich weiß, dass C++ Unterstützung dafür hat; Gibt es einen Grund, warum Java nicht? – templatetypedef

+0

@templatetypedef: Ich wäre mehr daran interessiert zu wissen, warum C++ * Unterstützung für etwas hat, das die Einkapselung ziemlich eindeutig verletzt. –

+0

Gültige Punkte, die Sie dort gemacht haben, aber Ihre Antwort hätte stärker sein sollen. Du kannst es tatsächlich nicht **, auch wenn du es willst. Java erlaubt es nicht. –

2

Nun, es gibt keine direkte Möglichkeit, dies zu tun, aber Sie können immer versuchen, Workarounds.

Ich bin mir nicht sicher über den Zweck der Zugriffsmethode in Klasse A von Klasse C, aber Sie können immer diese Methode erhalten.

Sie könnte entweder eine Instanz der Klasse A in der Klasse C erstellen und wenn das zu einfach aussieht, könnte versuchen, mithilfe von Reflektion API ... [link text] [1]

Extreme Java

+0

Ich wollte nur wissen, ob es möglich ist. Aber ja, das Erstellen einer Instanz von A würde auch funktionieren. –

10

folgenden Code ein Workaround sein (nicht nett, aber sollte funktionieren):

+0

Ich wollte nur wissen, ob es möglich ist. Aber ja, das wäre ein guter Workaround. –

Verwandte Themen