methoden Überladen



  • Hallo gomberl, erst mal vielen Dank für Deine Mühen!!

    gomberl schrieb:

    dann stell ich dir ein paar fragen:

    1. 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 reinschmeissen

    die 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.

    1. interface methoden brauchen nicht abstract zu sein - das sind sie automatisch

    da hast Du recht.

    1. 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 es

    Habe 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 Component

    Habe 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 aufrufen

    zu
    public void add(comp)
    { super.add() }
    usw

    jetzt 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 heisst

    ein
    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) aufrufen

    ich 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.


Anmelden zum Antworten