Vererbung Geerbte Methode verstecken?

Flashbanger

Mitglied
Hallo

Ich habe eine Klasse von JTable abgeleitet und möchte bei dieser nun einige Methoden verstecken, da sie in meiner Subklasse nicht vom Benutzer ausgeführt werden sollen und die Komponente unübersichtlich macht.

Ich dachte daran sie einfach mit einer Methode mit gleichen Parametern und gleichem Namen zu überschreiben jedoch mit "private" statt "public".

Doch anscheinend geht das so nicht... ich bekomme einen Compiler-Hinweis

"...cannot overrride ... attempting to assign weaker access privileges; was public"

Kann man in Java keine Methoden und Eigenschaften der Elternklasse verstecken?

Liebe Grüße

Flashbanger
 
N

nillehammer

Gast
Nein, das geht leider nicht. Man kann die Sichbarkeit von geerbten Methoden in Java nur erweitern, nicht einschränken. Die einzige Möglichkeit, die Nutzung zu verhindern ist, sie in der abgeleiteten Klasse mit der selben Sichbarkeit zu überschreiben und eine Exception zu werfen, z.B. UnsupportedOperationException. Das sollte man dann im JavaDoc dokumentieren. Außerdem kann man die Methoden per Annotation und im JavaDoc als deprecated kennzeichnen. So sieht der Programmierer in den meisten IDEs, dass er eine Methode benutzt, die er eigentlich nicht benutzen sollte.
 
N

nillehammer

Gast
Dann steht sie aber immernoch im Komponenten-Editor meiner IDE(Netbeans) und in der automatischen Code-Vervollständigung oder?
Ja, lässt sich nicht ändern. Du könntest statt Vererbung aber auch mit Komposition arbeiten. Sprich, Du hast eine lokale Membervariable JTable, auf die Du die von Dir gewünschten Methodenaufrufe delegierst. Dann wärest Du frei bei der Methodenwahl. Du müsstest dann natürlich von einer anderen geeigneten Oberklasse oder Interface ableiten, damit Du Deine Komponente zur Anzeige bringen kannst.
 

Marco13

Top Contributor
Methoden verstecken (durch überschreiben und vielleicht werfen einer UnsupportedOperationException :autsch: ) ist doch Bogus - eben gerade das Gegenteil des Sinnes von Vererbung. Einerseits ist der Wunsch nachvollziehbar (dass z.B. JComponent von Container erbt ist ja eigentlich ... "unpassend"), aber ... von einer Klasse wie JTable erben allein klingt IMHO schon fragwürdig. Warum erbst du davon? Welche Methoden kommen dazu, welche werden verändert, und welche würdest du weglassen?
 
N

nillehammer

Gast
Marco13 hat gesagt.:
Methoden verstecken (durch überschreiben und vielleicht werfen einer UnsupportedOperationException ) ist doch Bogus - eben gerade das Gegenteil des Sinnes von Vererbung
Stimmt. Ich wollte die Sinnhaftigkeit aber nicht in Frage stellen und habe geschrieben, was man machen kann. So wird es sogar in den Java-APIs selbst gemacht (z.B. siehe die Interfaces des Collection-Frameworks)
 

Flashbanger

Mitglied
Ich will auf der JTable kleine Icons darstellen. Meine ersten Test waren auch erfolgreich und die Bilder werden bereits angezeigt.

Nun will ich aber der geerbten Klasse eine Methode verpassen die einen Dateipfad verlangt und wahlweise seine Daten aus dieser Datei laden oder in diese Datei speichern soll. Wie das geschehen soll ist hier allerdings offtopic.

Da ich 80% der Methoden von JTable dafür nicht brauche oder nur intern brauche(z.b. muss ich von außen keinen Zugriff auf TableModel haben, da dies überhaupt nicht vom User verändert wird) - Zwar könnte ich die Methoden überschreiben und ins Leere laufen lassen, doch dadurch wird das Problem sehr unelegant gelöst, da die Methoden weiterhin existieren, der User mit Ihnen jedoch keinen Unfug mehr anstellen kann.

Mein eigener Lösungsansatz wäre ein Container, der selbst am besten kaum öffentliche Eigenschaften&Methoden besitzt und die geerbte Klasse auf sich darstellt. Die geerbte Klasse wäre dann im Container "private". Doch was wäre so ein schlanker Container?

Liebe Grüße

Flashbanger
 

Marco13

Top Contributor
@tfa: http://www.java-forum.org/softwareentwicklung/76540-sinn-unsupportedoperationexception.html hatte ich auch schonmal einen Thread aufgemacht. Wenn man mal versucht, eine etwas komplexere Hierarchie in diesem Sinne zu gestalten, merkt man schnell, dass das, was in Java Collections API Design FAQ gesagt wird, keine lahme Ausrede ist ;)

@Topic: Icons darstellen ist erstmal larifari, da setzt mal einen passenden CellRenderer von außen. Was du dann von "wahlweise seine Daten aus dieser Datei laden oder in diese Datei speichern" gesagt hast, erschließt sich nicht ganz, und hat auch nichts mit Icons zu tun. Die JTable zeigt Daten an. Wenn du nicht sagen kannst: "Jedes Objekt meiner Klasse IST EINE JTable", dann ist Vererbung dort der falsche Weg. Daten Lesen und schreiben hat im Idealfall nichts mit dem GUI (und damit auch nichts mit einer JTable) zu tun (wobei Icons Grenzfälle sind, ggf. müßtest du das näher erläutern). Wenn du nur die Daten lesen und schreiben willst, die IN der Tabelle stehen, dann sollten es zwei statische Utility-Methoden tun: Die eine liest eine Datei und spuckt ein TableModel aus, die andere bekommt ein TableModel und schreibt es in eine Datei.
 

Flashbanger

Mitglied
Ich wollte mit meiner Klasse eine Komponente schreiben, die ein Gleisbild darstellen kann. Dies wird aus kleinen png-Bildern zusammengesetzt. Das klappt auch ganz gut soweit. Meine Klasse soll am Ende eigene Events besitzen, und etwa beim Klick auf eine bestimmtes Icon(Bspw ein rotes Signal) wird das dortige Icon geändert (Gegen ein grünes Signal) und ein Event aufgerufen. In Delphi hab ich das alles schonmal geschrieben, den grundsätzlichen Ablauf bekomme ich da denk ich mal hin.

ich hab mich desshalb für JTable entschieden, da diese sich relativ einfach zu meiner Komponente erweitern lässt. Doch ein direktes Erbe von JTable erzeugt sehr viele "Altlasten". Beispielsweise muss der User nicht die Zellgröße einstellen können. Die Größe der png-Bilder gibt die Zellgröße vor. Es ist mit bereits gelungen die JTable in einer von JPanel geerbten Klasse zu kapseln. Doch auch JPanel ist doch noch relativ schwer.

Liebe Grüße

Flashbanger
 

hdi

Top Contributor
Du kannst sowas durchaus erreichen, und zwar durch Komposition und Delegation statt Vererbung.

D.h.: Du erbst nicht von JTable sondern du hast eine Instanz-Variable die auf einen JTable referenziert.

Die Methoden, die in der Kindklasse "von JTable geerbt" sein sollen, implementierst du nach und delegierst an den Table.

z.B.:

Java:
public void setModel(TableModel m){
   internalTable.setModel(m);
}

Die Methoden, die nicht da sein sollen, implementierst du auch nicht.

Damit hast du das "versteckt". Ok - es gibt natürlich schon einen Unterschied: Deine Instanz ist typ-technisch nicht mit JTable kompatibel. Ich weiß nicht inwieweit das in deiner App dann Probleme machen kann. Zur Not kannst du immernoch einen Getter für die interne Table-Referenz implementieren...

edit: Oh Gott sorry, scheinbar wurde das ja schon vorgeschlagen. Der letzte Post war so klein, den hab ich gar nicht wahrgenommen.. Sry für Spam
 

Flashbanger

Mitglied
Du kannst sowas durchaus erreichen, und zwar durch Komposition und Delegation statt Vererbung.

D.h.: Du erbst nicht von JTable sondern du hast eine Instanz-Variable die auf einen JTable referenziert.

Die Methoden, die in der Kindklasse "von JTable geerbt" sein sollen, implementierst du nach und delegierst an den Table.


Seh ich das richtig.

Ich schreibe eine x-beliebige Klasse, welcher eine JTable übergeben werden kann. Meine Klasse greift dann auf die JTable zu und verändert deren Parameter nach meinen Wünschen und ruft Ihre Methoden auf?

Liebe Grüße

Flashbanger
 

hdi

Top Contributor
Ja genau. Die JTable muss auch nicht zwangsläufig übergeben werden, die Klasse kann die ja selbst erzeugen und verwalten:

Java:
class MyTable{

   private JTable table; // <- Das nennt sich Komposition

   public MyTable(){
       table = new JTable();
   }

   public void setModel(TableModel m){
       table.setModel(m); // <- Das nennt sich Delegation
   }

   ....

}

So kannst du eben eine JTable-Ableitung mit Verstecken einiger JTable-Methoden faken. Aber es ist eben nur ein Fake, da jetzt deine Klasse nicht tpy-kompatibel mit JTable ist. Aber wie gesagt falls du doch mal die JTable brauchst, pack noch rein:

Java:
   public JTable getTable(){
       return table; 
   }

Ist halt nur ein Workaround - ein echtes Verstecken von geerbten Methoden gibt es leider nicht, da du die Access Modifier in der Kindklasse nur auflockern kannst (aus protected wird public) aber nicht einschränken kannst (public zu protected oder private).
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Wenn du mit "schwer" meinst, dass es viele Methoden hat: Ja. Aber trotzem ist JPanel die "minimale" konkrete Klasse für Components, die es in Swing gibt. Und wenn du das ganze irgendwo anzeigen willst, wirst du nicht drumrumkommen, irgendwo eine JComponent/JPanel zur Verfügung zu stellen. Die eigentliche Funktionalität ist davon ja unabhängig. Bisher klingt es für mich nach zwei Dingen:
1. Du hast mal in Delphi etwas geschrieben, und willst jetzt "das gleiche" in Java schreiben. Unabhängig davon, dass die Sprachen und die APIs unterschiedlich sind, und unabhängig davon, dass vielleicht schon das, was du in Delphi geschrieben hattest, "nicht gut" war, und durch irgendwelche Würgarounds in Java jetzt noch schlimmer wird
2. Du vermischst Model und View, bzw. die GUI mit dem, was dieses "Gleisbild" eigentlich ausmacht, und versuchst, die JTable als allgemeine "Rasterzeichenfläche" zu verwenden...

Aber vielleicht liege ich mit beidem falsch. Anregungen, um das besser zu strukturieren, hast du ja schon. Für weitergehende Tipps müßtest du mehr Infos posten.
 
B

benutzer1234

Gast
Doch anscheinend geht das so nicht... ich bekomme einen Compiler-Hinweis

Die Sichtbarkeit darf nicht reduziert werden, weil überall dort, wo ein der Typ einer base class verlangt ist, auch irgendeine sub class dieser Klasse eingesetzt werden können muss.

Base class und sub class hab ich jetzt auf aus dem Wiki-Artikel übernommen: Inheritance (object-oriented programming) - Wikipedia, the free encyclopedia

Die Verfügbarkeit bestimmter Methoden einzuschränken ist sinnvoll u.a. bei der Fehlervorbeugung, wenn es sonst zu viele Möglichkeiten gibt, un um Ausfallwahrscheinlichkeiten/Fehlfunktionen/Überschwemmungen zu minimieren.

Hm, hoffentlich nicht zu diffus. :)
 

Andi_CH

Top Contributor
Das geht nur, wenn du nicht vererbst, sondern eine Interfaceklasse davor baust - oder soll ich sagen einen Proxy?
Einfach eine Klasse die genau die Methoden anbietet, die du weitergeben willst und dahinter die der "echten" Klasse aufruft.
 
Zuletzt bearbeitet:

Flashbanger

Mitglied
Wie groß ist das Raster? Bei mehr als 10x10 ist alles, was auf einzelnen JComponents aufbaut (auch indirekt, wie die JTable) ziemlich fragwürdig. Siehe auch http://www.java-forum.org/java-basi...694-pingpong-selber-schreiben.html#post394005

nunja das Raster kann schon mal 100x100 oder 200x200 werden.

Ich habe aber eben mal ein kleines Testprogramm geschrieben. Bei diesem wurden alle Zellen der Table mit zufälligen Gleismosaiken gefüllt. Die RAM-Auslastung des Programms stieg von 20 MB auf 60 MB. Würde sich der Speicherverbrauch drastisch reduzieren, wenn ich die Gleismosaike selbst zeichne (z.b. auf ein JScrollPane)? Ich würde dann natürlich nur die Gleismosaike Zeichnen lassen, die gerade im sichtbaren Bereich liegen.

LG Flashbanger
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Vermutlich hast du das mit dem Taskmanager nachgeschaut, da haben die 20 oder 60 MB nicht viel zu sagen: Nur weil da 60MB für "Java" steht, heißt das nicht, dass so viel wirklich belegt ist. Es ist schon so, dass bei einem Raster aus Components recht viel Speicher verschwendet wird (siehe die Auflistung im verlinkten Beitrag) allerdings ist das nur ein Teilaspekt. Dort steckt auch ein Haufen "Verwaltungszeug" dahinter. Es sind schlicht und einfach SEHR viele Components. Bei einer JTable wäre das weit, weit weniger Problematisch, aber... auch das wäre ein Bogus-Hack: Eine JTable ist eine Tabelle, mit spalten und Zeilen und Headern und wasweißich. Wenn du ein Raster zeichnen willst, dann solltest du das auch tun. Man braucht dann i.a. nicht mal besonders viel zu tun, um "nur die sichtbaren" Zellen zu zeichnen: Da kümmert sich Swing schon um ziemlich viel.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Geerbte Instanz kann keine void Methode ausführen?! Java Basics - Anfänger-Themen 15
Developer_X Geerbte Methoden ignorieren Java Basics - Anfänger-Themen 5
T Rekursive Methode Java Basics - Anfänger-Themen 13
Ü Methode soll Quadrat aus der Summer zurückgeben Java Basics - Anfänger-Themen 10
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
Leyla Spezifischte Methode Java Basics - Anfänger-Themen 16
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
M Methode sperren bis ein Kriterium erfüllt wurde Java Basics - Anfänger-Themen 3
D Switch Case Methode aufrufen Java Basics - Anfänger-Themen 3
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
til237 Iterative Methode in rekursive Methode umschreiben Java Basics - Anfänger-Themen 4
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
D next() Methode mehrfach verwenden Java Basics - Anfänger-Themen 1
Ostkreuz Methoden Von Dezimal zu Hexadezimal Methode toHex Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
N Throw an Main Methode übergeben Java Basics - Anfänger-Themen 7
M Methoden Methode 'wiederhole' nicht gefunden (Uebersetzungsfehler) Java Basics - Anfänger-Themen 1
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
D Methode aus dem Aufrufer aufrufen Java Basics - Anfänger-Themen 1
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
M generate Methode für Streams Java Basics - Anfänger-Themen 6
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
I Optionaler Parameter bei Methode, der nur optional ist? Java Basics - Anfänger-Themen 6
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
T Linked List set-Methode Java Basics - Anfänger-Themen 2
D Arrays an replaceAll-Methode übergeben Java Basics - Anfänger-Themen 12
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
W Equals-Methode überschreiben bei composition Java Basics - Anfänger-Themen 20
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
V Methoden printChar Methode mit Rückgabetyp void Java Basics - Anfänger-Themen 26
F Graph Tiefensuche Methode Java Basics - Anfänger-Themen 7
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
M Warum return die Methode den Wert nicht Java Basics - Anfänger-Themen 5
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
S Methode Java Basics - Anfänger-Themen 4
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
Liroyd Methode mit Objektvariabel rechnen? Java Basics - Anfänger-Themen 6
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
D Methode um mögliche Rezepte auszugeben Java Basics - Anfänger-Themen 12
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
D Array in Main Methode aus anderer Klasse aufrufen Java Basics - Anfänger-Themen 3
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
G jButton führt Main Methode nicht richtig aus Java Basics - Anfänger-Themen 3
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
C60 Methoden Main-Methode erkennt meine Arrays nicht. Java Basics - Anfänger-Themen 7
A Ein Array bearbeiten und in einer anderen Methode nutzen Java Basics - Anfänger-Themen 6
A Ergebnis einer Methode bei einer anderen verwenden Java Basics - Anfänger-Themen 13
L Iteratorform und Methode mit variabler Parameterzahl Java Basics - Anfänger-Themen 31
F Methode ArrayList mit Eingabewert Java Basics - Anfänger-Themen 2
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
M Wie kann die Implementation einer Methode den Wert eines Attributs vermindern? Java Basics - Anfänger-Themen 3
Csircc Rekursive Methode Stack Overflow Java Basics - Anfänger-Themen 10
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
M Wie kann eine Methode eine andere Methode um Werte wie z.B. 1 erhöhen? Java Basics - Anfänger-Themen 6
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
D mehrere Berechnungen in einer Methode Java Basics - Anfänger-Themen 9
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
J ArrayList add methode selbst programmieren Java Basics - Anfänger-Themen 10
X Methoden Methode zur Punktezählung in Blackjack Java Basics - Anfänger-Themen 2
W Methode ändern Java Basics - Anfänger-Themen 65
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben