Mr. OOP: Von Elternklasse geerbte Methoden verstecken

Hallo,

Ich habe eine Klasse die ist von einer anderen Klasse abgeleitet. Nun sind ja bekanntlich alle Methoden der Elternklasse in meiner Klasse verfügbar. Ich möchte nun einige dieser geerbten Methoden verstecken damit diese für einen späteren Benutzer meiner Klasse nicht sichtbar sind. Ist das möglich?

Gruss Marc

  1. Hi,

    ja, das ist möglich. Dazu müssen die entsprechenden Methoden in der Elternklasse (und folglich auch in der abgeleiteten Klasse) als protected deklariert sein

    Jimbo

    1. hi!

      ja, das ist möglich. Dazu müssen die entsprechenden Methoden in der Elternklasse
      (und folglich auch in der abgeleiteten Klasse) als protected deklariert sein

      Aeh, nein. Das ist auf gar keinen Fall moeglich. Es ist in Java und auch anderen OOP-
      Sprachen nicht erlaubt, das Interface in Unterklassen einzuschraenken. Dadurch
      wuerde man ja auch das Konzept der Objektorientierung durcheinander werfen, dass
      naemlich Unterklassen mindestens die gleichen Eigenschaften haben wie ihre Eltern.

      bye, Frank!

      --
      Never argue with an idiot. He will lower you to his level and then
      beat you with experience.
    2. Hi,

      ja, das ist möglich. Dazu müssen die entsprechenden Methoden in der Elternklasse (und folglich auch in der abgeleiteten Klasse) als protected deklariert sein

      Jimbo

      Ich kann die Elternklassen aber nicht beeinflussen, bzw. abändern.

  2. Hi Marc,

    du darfst die Sichtbarkeit von Methoden bei der Vererbung von der Ober- auf die Unterklasse nicht verkleinern!
    D.h. ererbte Methoden kannst du nicht verstecken!

    LG Andrea

    Ich habe eine Klasse die ist von einer anderen Klasse abgeleitet. Nun sind ja bekanntlich alle Methoden der Elternklasse in meiner Klasse verfügbar. Ich möchte nun einige dieser geerbten Methoden verstecken damit diese für einen späteren Benutzer meiner Klasse nicht sichtbar sind. Ist das möglich?

  3. Hi,

    Ich habe eine Klasse die ist von einer anderen Klasse abgeleitet. Nun sind ja bekanntlich alle Methoden der Elternklasse in meiner Klasse verfügbar. Ich möchte nun einige dieser geerbten Methoden verstecken damit diese für einen späteren Benutzer meiner Klasse nicht sichtbar sind. Ist das möglich?

    Verstecken geht nicht.
    Aber durch Dummies überladen sollte gehen.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  4. Ich habe eine Klasse die ist von einer anderen Klasse abgeleitet. Nun sind ja bekanntlich alle Methoden der Elternklasse in meiner Klasse verfügbar. Ich möchte nun einige dieser geerbten Methoden verstecken damit diese für einen späteren Benutzer meiner Klasse nicht sichtbar sind. Ist das möglich?

    du nimmst ein fertiges programmstück, welches ein anderer entwickler erstellt hat.
    du benutzt (erweiterst) die klasse, damit du nicht alles neu erfinden mußt.
    damit hast du eine neue klasse, welche andere benutzen können. denen ist es egal ob das programmstück in deiner klasse steht, oder ob du dies 'geerbt' hast.
    willst du nun geerbte methoden verstecken, welche der entwickler aus welchen gründen auch immer nicht als privat deklariert hat, mußt du diese methoden überschreiben und deine eigene sicht setzen.
    schließlich hat der entwickler der geerbten klasse sich irgendetwas dabei gedacht, und du kannst ja nicht einfach die eigenschaften 'seines' programmes im nachhinein ändern.

    1. Hallo fk,

      willst du nun geerbte methoden verstecken, welche der entwickler aus welchen gründen auch immer nicht als privat deklariert hat, mußt du diese methoden überschreiben und deine eigene sicht setzen.

      Wenn Du mit "sicht" die Sichtbarkeit meinst, so kannst Du die nicht weiter einschränken als das die Elternklasse tut. Du kannst also eine Methode, die als protected deklariert ist mit eine öffentlichen überschreiben, umgekehrt aber natürlich nicht.

      Manchmal ist es tatsächlich sinnvoll, bestimmte Methoden einer Schnittstelle oder einer Elternklasse nicht zu Unterstüzen. In diesem Fall kann man in der Implementierung der Kindklasse eine UnsupportedOperationException werfen. (Bei Listen, die nur gelesen werden können wird das z.B. so gemacht, wenn man set() aufruft)
      Damit sollte man aber sehr vorsichtig sein, speziell dann, wenn die throws-Angabe der Methode in der Elternklasse nicht angibt, dass diese Exception geworfen werden kann. Dies ist nicht zwingend notwendig, da UnsupportedOperationException eine RuntimException ist, aber wenn die Elternklasse nicht vorsieht, dass eine Operation u.U. nicht unterstüzt wird, sollte man sich gut überlegen, ob man nicht etwas grundsätzliches falsch macht, wenn man das tun will.

      Grüße

      Daniel

      1. Hi Daniel,

        Damit sollte man aber sehr vorsichtig sein, speziell dann, wenn die throws-Angabe der Methode in der Elternklasse nicht angibt, dass diese Exception geworfen werden kann....

        Yep. Eine solche Lösung ('leere Implementierung' und/oder entsprechende Exception) finde ich aber auch deswegen schon "unglücklich", weil das "Versprechen", das die ererbte API-Spezifikation macht, zwangsläufig "gebrochen" wird. Ob es sich hierbei dann überhaupt noch um polymorphes Verhalten handelt, könnte man sicherlich auch diskutieren.
        Dieser Schuss kann ganz schnell in die Hose gehen. Nur mal so vorgestellt: Man hat irgendeine (typisierte) Collection, iteriert über die Member und ruft in Erwartung des in der API spezifizierten Verhaltens irgendeine Methode auf. Ist bestimmt nett, wenn man auf einmal zur Laufzeit eine UnsupportedOperationException "um die Ohren gehauen bekommt".

        Viele Grüße,
        Martin