# Mehrfachvererbung/eigene Klassen



## kittie (5. April 2004)

Hi,
ich habe folgendes Problem:

Ich habe eine eigene Klasse "KMaske0" geschrieben,die aus "Component" erbt.
In der KMaske0 stehen Konstruktoren,Methoden,erzeugte Objekte.,...
Weiterhin hab ich ne "KMaske1" erstellt,die aus "KMaske0" erbt.
In der "KMaske1" stehen mehrere Methoden zum Sortieren und Visualisieren des Sortiervorgangs.
Nun soll ich eine weitere Klasse"Sortierverfahren" erstellen, die aus "KMaske1" erbt. Als Fehler bekomme ich angezeigt,dass in "KMaske1" keine Konstruktoren vorhanden sind....... Und nun? 
Wie bekomme ich die Aufgabe erfüllt,dass "Sortierverfahren" aus "KMaske1" erbt?

Danke schonmal =)

steff / kittie


----------



## Ein_Freund (5. April 2004)

Also ohne den Quellcode zu sehen, ist das schwierig. Ich müsste zum Beispiel wissen, an welcher Stelle der Fehler auftritt? 

Poste doch einfach mal den Quellcode von 'KMaske1'  und  'Sortierverfahren'. 

Oder schick's mir per PN.


----------



## kittie (5. April 2004)

also Quellcode von "Sortierverfahren":

import java.awt.*;
import java.applet.Applet.*;

class Sortierverfahren extends KMaske1
{
  private Applet app;
  protected Choice= new Choice();
  Choice auswahl;
  Sortierverfahren(Applet a,String ue)
  {
    super(a,ue,"Visualisierung von Sortierverfahren");
  }

  public void starte()
  {
    auswahl.add("BubbleSort");
    auswahl.add("austauschSort");
    protected void starten()
    {
     startKnopf.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        switch(auswahl.getSelectedIndex())
        {
_// da fehlen jetz noch die methoden......_ 
        }


    }
  }
}

Also diese Klasse ist noch nicht vollständig..Aber mein Hauptproblem liegt darin,eine Mehrfachvererbung hinzukriegen.

KMaske1 ist:

import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;

class KMaske1 extends KMaske0
{
  private Applet app;
  protected int breiteC = 350, hoeheC = 350;
  protected Color hintergrund = Color.black;
  protected Color vordergrund = Color.red;
  protected Canvas malflaeche = new Canvas();
  protected int anzahl = 50;
  protected Button generierTaste = new Button("Generieren");
  protected Button darstellTaste = new Button("Darstellen");

  KMaske1 (Applet a,String ue)
  {
    super( a,ue,"Anzahl");
  }

  public void starte()
  {
    listenFelder = 12;
    eingabe1.setText(""+anzahl);
    pSued.add(generierTaste);
    pSued.add(darstellTaste);
    super.starte();
    malflaeche.setBackground(hintergrund);
    malflaeche.setForeground(vordergrund);
    malflaeche.setSize(breiteC, hoeheC);
    pMitte.add(malflaeche);

    generierTaste.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        generieren();
      }
    });

    darstellTaste.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        darstellen();
      }
    });}


    protected void loeschen()
    {
      super.loeschen();                               //Löschen der Liste
      Graphics g = malflaeche.getGraphics();          //Löschen der Malfläche durch Übermalen
      g.setColor(hintergrund);                        // mit der Hintergrundfarbe
      g.fillRect(0,0, malflaeche.getSize().width, malflaeche.getSize().height);
      g.dispose();                               //Freigabe der von g belegten Ressourcen
    }
    protected void iFuegeAn(int i)
    {
      super.iSchreibe(i);                              //Erweitern der Liste
      //plott(liste.getItemCount() - 1,i,vordergrund);   //Graph.Pendant
    }

    protected int iLiesListe(int pos)                  //aus der Liste lesen
    {
      return Integer.valueOf(liste.getItem(pos)).intValue();
    }

    protected void plott(int i,int d,Color c)        //eine Kreisscheibe in der angg.Farbe
    {                                                //auf Malfläche zeichnen
      Graphics g= malflaeche.getGraphics();
      g.setColor(c);
      g.fillOval(i*5,(int)(hoeheC - 5 - 5*d),5,5);  //Mittelpunkt,Achsen(d.Punktes)
      g.dispose();
      try{
        Thread.sleep(50); }                         //50 Millisekunden Pause
        catch (InterruptedException e){ }           //Ausnahmebehandlung
    }
    protected void iErsetze(int i,int k)
    {
      int vorher;
      vorher=iLiesListe(i);
      liste.replaceItem(String.valueOf(k),i);
      plott(i,vorher,hintergrund);                 //vorhergehende darstellung wird übermalt
      plott(i,k,vordergrund);                      //neuer Punkt mir Vordergrund
    }
    protected void iTausche(int i,int k)
    {
      int di,dk;
      di=iLiesListe(i);dk=iLiesListe(k);
      iErsetze(i,dk);
      iErsetze(k,di);
    }
    protected void generieren()
    {
      anzahl=iLies(eingabe1);
      super.loeschen();                     // "loeschen" =Löschmethode aus KMaske0
      for(int i=0;i<anzahl;i++) iFuegeAn(i);
      for(int i=0;i<anzahl;i++)
      {
        int z= (int) (Math.random()*(anzahl-i));
        iTausche(z,anzahl - i -1);
      }
    }

    public void darstellen()
    {
      anzahl=iLies(eingabe1);
      for(int i=0;i<anzahl;i++) plott (i,iLiesListe(i),vordergrund);

    }

    protected void starten()
    {

    }


}


----------



## Ein_Freund (5. April 2004)

Ich kann in der Klasse Sortierverfahren einen Konstruktoraufruf mit 3 Argumenten finden, aber in Klasse KMaske1 nur einen Konstruktor mit 2 Argumenten in der Signatur. 


 Sortierverfahren(Applet a,String ue)
{
super(a,ue,"Visualisierung von Sortierverfahren"); // Hier werden drei Argumente übergeben
}

 KMaske1 (Applet a,String ue) //Erwartet nur zwei Argumente
{
super( a,ue,"Anzahl");
}

Probier' mal, ob es daran liegt.


----------



## Matthias Reitinger (6. April 2004)

Java ist zwar nicht grad meine Domäne, aber so weit ich weiß gibt es in Java keine Mehrfachvererbung in dem Sinne (wie beispielsweise in C++). Eine Klasse kann nur immer von einer übergeordneten Klasse vererbt werden. Du könntest höchstens mit Interfaces arbeiten.

Siehe auch hier:
http://www.fh-wedel.de/~si/vorlesungen/java/OOP/Mehrfachvererbung.html


----------



## Ein_Freund (6. April 2004)

Du hast natürlich recht, Matthias. Eine Mehrfachvererbung im Sinne von  C++ gibt es bei Java nicht. Das Schlüsselwort 'SUPER' spricht  nur die vererbende Klasse an. Und das macht auch Sinn. Anderenfalls würde jede Klasse, die den SUPER-Konstruktor aufruft, die Klasse 'object' ansprechen...


----------



## kittie (6. April 2004)

Hm..... also am Konstruktor liegt es anscheinend nicht,die Konstruktoren sind übrigens in KMaske0 definiert.... (Sortierverfahren erbt aus KMaske1 erbt aus KMaske0) 
Wie bekomme ich das hin, dass Sortierverfahren ein Interface ist. bzw wie lautet die Syntax für Interfaces?(Sorry.... überhaupt keine Ahnung von..)

P.s. Ich bekomme folgenden Fehler, wenn ich im Konstruktor zwei Werte übergeben lasse: Sortierverfahren.java:20:'class' or 'interface' expected


----------



## Snape (14. April 2004)

> _Original geschrieben von kittie _
> Hm..... also am Konstruktor liegt es anscheinend nicht,die Konstruktoren sind übrigens in KMaske0 definiert.... (Sortierverfahren erbt aus KMaske1 erbt aus KMaske0)



Jein. Wenn in KMaske0 ein Konstruktor mit 3 Parametern vorhanden ist, muss in den von KMaske0 abgeleiteten Klassen ebenfalls ein Konstruktor mit 3 Parametern vorhanden sein. Notfalls einfach
KMaske1(p1, p2, p3)
{
super(p1, p2, p3);
}

und gut is.



> Wie bekomme ich das hin, dass Sortierverfahren ein Interface ist. bzw wie lautet die Syntax für Interfaces?(Sorry.... überhaupt keine Ahnung von..)



Schnapp Dir ein Buch dazu.
Nur kurz: Ein Interface ist eine eigene Klasse. In ihr werden lediglich Methoden definiert (nicht implementiert!), die alle Klassen implementieren müssen, die dieses Interface benutzen wollen. Also wenn Du ein Interface MyInterface angelegt hast:

public interface MyInterface
{
	public void blaBlubChanged(BlaBlubEvent evt);
}

Dann kann ich in meiner Klasse das Interface so einbauen:
class MyClass implements MyInterface
{
...
public void blaBlubChanged(BlaBlubEvent evt)
{ // hier tue ich was ich für richtig halte, z.B.
System.out.println("Hallo Welt");
}
}

Meistens werden Interfaces als Listener benutzt, aber das jetzt hier zu erklären ginge echt zu weit...


----------

