methoden Überladen
-
Hallo gomberl, erst mal vielen Dank für Deine Mühen!!
gomberl schrieb:
dann stell ich dir ein paar fragen:
- was macht dein interface - ich habe den leisen verdacht das du dir noch nicht so ganz klar bist was ein interface ist und wie das funktioniert
Es soll Methoden vorgeben welche von den Klassen die es "interfacen", implementiert werden müssen da es keine Mehrfachvererbung bei java gibt muss ich das über ein interface machen.
2)was willst du mit der add methode machen
- du kannst auch nicht super.add() sagen wenn du ein object hast
das in Container add als add(java.awt.Component) deklariert ist kannst du kein object reinschmeissendie add Methode soll bestimmte Komponenten "abfangen". D.h. diese Bestimmten Komponenten die geadded werden, sollen vorher noch in eine andere Datenstruktur reingepackt werden bevor sie dem JPanel hinzugefügt werden.
- interface methoden brauchen nicht abstract zu sein - das sind sie automatisch
da hast Du recht.
- kann es nicht sein das du einfach nur add(Component) als methode deines interfaces haben willst ???
verstehe nicht was Du meinst, aber könnte stimmen
ich glaube das waere esHabe ich Dich vielleicht so richtig verstanden: Das Problem bei mir ist das ich die Methode welche aus java.awt.COmponent stammt nicht überschreibe. Ich implementiere nur die Methode add(Object o) aus dem interface aber über schreibe die Methode die geerbt wird nicht.
Wenn ja verstehe ich nicht ganz was es bringt die einfach mit
public void add(java.awt.Component comp){
super.add(comp);
}zu überschreiben.
Naja ich habs mal gemacht und nun kommt kein neuer Fehler mehr
wie gesagt versthen tue ichs nicht ganz warum das überschreiben der Methode die ambiguität auflöst..
-
kein problem
das stimmt schon so ca - ein interface ist ein vertrag das eine klasse bestimmte methoden implementiert.
Das mit Mehrfachvererbung ist nur bedingt richtig. Aber lassen wir das. Die Feinheiten erklaer ich dir ein anderes mal. Im grossen und ganzen stimmt das.- jetzt haben wir das Problem
Du willst nur Komponenten abfangen. Nicht aber objects.
da komme ich auch gleich zu punkt 4.
Ich glaube was du machen willst ist einfach die add(Component) methode der superklasse zu überladen.
Die Fragestellung ist soll dein Interface generell Objects bearbeiten oder immer nur sub klassen von Component. Wenn du sagst Objects dann mach es so wie es jetzt ist.
Wenn du sagst object dann lösche die add(Object) methode und mache alles in ComponentHabe ich Dich vielleicht so richtig verstanden: Das Problem bei mir ist das ich die Methode welche aus java.awt.COmponent stammt nicht überschreibe. Ich implementiere nur die Methode add(Object o) aus dem interface aber über schreibe die Methode die geerbt wird nicht.
Wenn ja verstehe ich nicht ganz was es bringt die einfach mit
public void add(java.awt.Component comp){
super.add(comp);
}zu überschreiben.
Naja ich habs mal gemacht und nun kommt kein neuer Fehler mehr
wie gesagt versthen tue ichs nicht ganz warum das überschreiben der Methode die ambiguität auflöst
Genau so ist es.
Überladen ist problematisch n diesem Fall. der Compiler weiss nicht ob er die super oder sub klasse aufrufen soll
Du kannst nur Methoden innerhalb einer klasse überladen - dh mit verschiedenen parametern aufrufbar machen
ueber klassengrenzen geht es nicht
aber du kannst ja einfach die methode implementieren und über das super object aufrufenzu
public void add(comp)
{ super.add() }
uswjetzt sind beide methoden innerhalb der aktuellen klasse definiert
das heisst zur laufzeit kann unterschieden werden welche methode von den 2 aufgerufen wird. das geht nicht ueber klassengrenzen hinaus.
da du bei add(Component) hier nur dasselbe machen willst wie die superklasse reicht ein super.add(component)eins muss dir jetzt schon klar sein
alles was ein component ist - also alles was in awt oder swing enthalten ist wird NICHT von der add(object) methode abgearbeitet sondern von der add(Component methode) - das heisstein
if(component instanceof JButton){
in der add(object) bringt dir nichts
er wird dort nicht hinkommen
da JButton ein Component ist wird er immer
add(Component) aufrufenich hoffe ich habe nicht alle klarheiten beseitigt
-
gomberl schrieb:
Das mit Mehrfachvererbung ist nur bedingt richtig. Aber lassen wir das. Die Feinheiten erklaer ich dir ein anderes mal. Im grossen und ganzen stimmt das.
Das brauchst Du nicht. Ich glaube ich weis welchen Sinn und Zweck interfaces haben. Das Problem ist vielleicht das ich damit designtechnisch noch nicht so viele Erfahrungen gemacht habe, sodass ich nicht genau weiss ob ich in diesem Fall ein Interface verwenden soll.
eins muss dir jetzt schon klar sein
alles was ein component ist - also alles was in awt oder swing enthalten ist wird NICHT von der add(object) methode abgearbeitet sondern von der add(Component methode)Yep das ist klar. ABer ich habe es trotzdem verstanden. Nun muss ich eben die add(Object o) Methode im Interface durch java.awt.Component ersetzen.