8.3 Generalisierung-Blue J Bernard Schriek

BlueJNeuling

Mitglied
Hallo,
ich arbeite zur Zeit an einem einfachen Grafikprojekt aus einem Übungsbuch, jedoch kommen ich nicht so ganz weiter und, da ich mir das ganze selbst aneignen muss, bin ich sehr blutiger Anfänger.
Hier die Aufgabenstellung und das, was ich bisher erarbeitet habe.

Übung 8.3

Implementiere die Klassen Figur, Kreis und Quadrat.
Vorgehensweise:
− Erzeuge dazu erst eine abstrakte Klasse Figur.
− Kopiere anschließend die fast alle Dienste (nicht: zeichne und getroffen) von der
Klasse Kreis in die Klasse Figur.
− Entferne in der Klasse Kreis alle Dienste außer dem Konstruktor, zeichne und
getroffen. Kennzeichne zeichne als privaten Dienst.
− Ergänze die extends-Anweisung für die Kennzeichnung als Unterklasse.
− Erzeuge eine neue Klasse Quadrat und implementiere den Konstruktor und die Dienste zeichne und getroffen.

Java:
public class Hauptprogramm
{
    // Objekte
    Bildschirm derBildschirm;
    Tastatur dieTastatur;
    Maus meineMaus;
    Kreis meinKreis1, meinKreis2, meinKreis3;
    Kreis aktiverKreis;


    // Konstruktor
    public Hauptprogramm()
    {
        derBildschirm = new Bildschirm(900, 900);
        meineMaus = new Maus();
        dieTastatur= new Tastatur();   
        meinKreis1 = new Kreis(350, 350, 25, Farbe.BLAU);
        meinKreis2 = new Kreis(50, 50, 15, Farbe.ROT); 
        meinKreis3 = new Kreis(200, 200, 35, Farbe.GRUEN);        
        aktiverKreis = meinKreis1;
        aktiverKreis.aktiviere();
    }

    // Dienste
    public void fuehreAus()
    {
        // Aktionsteil
        do 
        {             
            //Entfernen des alten aktiven Kreises*Auswahl des Neuen
            
            if (meineMaus.istGedrueckt())
            {   aktiverKreis.deaktiviere();               
                if (meinKreis1.getroffen(meineMaus.hPosition(), meineMaus.vPosition()))
                    aktiverKreis = meinKreis1;                    
                else if (meinKreis2.getroffen(meineMaus.hPosition(), meineMaus.vPosition()))
                    aktiverKreis = meinKreis2;                    
                else if (meinKreis3.getroffen(meineMaus.hPosition(), meineMaus.vPosition()))
                    aktiverKreis = meinKreis3;                    
                aktiverKreis.aktiviere(); 
            }

            //Bewegung des aktiven Kreises + Ändern des Tastatur-Puffers   
            if (dieTastatur.wurdeGedrueckt())
            {
                switch (dieTastatur.zeichen())
                {
                    case Zeichen.PFEILRECHTS: aktiverKreis.bewegeUm(5,0); break;
                    case Zeichen.PFEILLINKS: aktiverKreis.bewegeUm(-5,0); break;
                    case Zeichen.PFEILOBEN: aktiverKreis.bewegeUm(0,-5);  break;
                    case Zeichen.PFEILUNTEN: aktiverKreis.bewegeUm(0,5); break;
                }
                dieTastatur.weiter();
            }
        } while (!meineMaus.doppelKlick());    
        // Aufraeumen
        derBildschirm.gibFrei();
        dieTastatur.gibFrei();
        meineMaus.gibFrei();
        meinKreis1.gibFrei();
        meinKreis2.gibFrei();
        meinKreis3.gibFrei();
        aktiverKreis.gibFrei();
    }

Hier beginnt die abstrakte Klasse

Java:
public abstract class Figur
{
    // Bezugsobjekte
    
    // Attribute

    // Konstruktor
    public Figur()
    {        
    }
    // Dienste   
    
    private void loesche()
    {
        hatStift.radiere();
        this.zeichne();
        hatStift.normal();
    }
    
    public void bewegeUm(int pH, int pV)
    {
        this.loesche();
        hatStift.bewegeBis(hatStift.hPosition() + pH,
            hatStift.vPosition() + pV);
        this.zeichne();
    }
    
    public void aktiviere()
    {
        this.loesche();
        hatStift.setzeLinienbreite(3);
        zAktiv = true;
        this.zeichne();
    }

    public void deaktiviere()
    {
        this.loesche();
        hatStift.setzeLinienbreite(1);
        zAktiv = false;
        this.zeichne();
    }
    
    private void gibFrei()
    {
        hatStift.gibFrei();
    }

Hier das Quadrat:
Java:
public class Quadrat extends Figur
{
    // Bezugsobjekte
    public Buntstift hatStift;

    // Attribute
    private int zGroesse; 
    private boolean zAktiv;

    // Konstruktor
    public Quadrat(int pH, int pV, int pGroesse, int pFarbe)
    {         
        hatStift = new Buntstift();
        hatStift.bewegeBis(pH, pV);
        hatStift.setzeFarbe(pFarbe);
        zAktiv = false;
        zGroesse = pGroesse;        
        this.zeichne();
    }
    // Dienste
      
    private void zeichne()
    {
        hatStift.zeichneRechteck(zGroesse, zGroesse);
    }

    public boolean getroffen(int pH, int pV)
    {
         return (pH - hatStift.hPosition())*(pH - hatStift.hPosition())
                <= zGroesse*zGroesse;
    }

Ich weiß, dass das viel und unübersichtlich ist, aber ich komme echt nicht weiter...ich arbeite (wie im Titel) übrigens mit Blue J!
Also was muss ich tun? Die Klasse Kreis ist fertig...
 
Zuletzt bearbeitet von einem Moderator:

BlueJNeuling

Mitglied
Das war aber nur die halbe Miete, es bedarf auch einer einsatzbereiten SUM-Bibliothek: https://www.mg-werl.de/sum/ (Buch 1, Kap. 3ff.) und mehrerer Hinweise, welche Quellcodes vorgegeben und welche Eigenkonstrukte sind. Und wie die Vererbungs-Beziehungen (ist eine Musterlösung vorhanden ?) aussehen sollten...
Nein, es ist keine Musterlösung vorhanden. Ich habe die Bibliothek und alle anderen Projekte haben bisher auch funktioniert, ich kriege nur nicht den Code für das Programm zusammen.
 

temi

Top Contributor
ich kriege nur nicht den Code für das Programm zusammen.
Du hast doch oben Code stehen. Auf den ersten Blick schaut das doch nicht so schlecht aus. Funktioniert denn etwas nicht? Falls ja, was?

Ergänzung: Die beiden Methoden zeichne() und getroffen() sollen vermutlich in der abstrakten Klasse auch abstrakt sein und von den beiden anderen Klassen implementiert werden.
 

BlueJNeuling

Mitglied
Du hast doch oben Code stehen. Auf den ersten Blick schaut das doch nicht so schlecht aus. Funktioniert denn etwas nicht? Falls ja, was?

Ergänzung: Die beiden Methoden zeichne() und getroffen() sollen vermutlich in der abstrakten Klasse auch abstrakt sein und von den beiden anderen Klassen implementiert werden.
Nein, die Dienste getroffen und zeichne muss ich in die jeweiligen Unterklassen machen, da diese unterschiedlich sin. Ich bekomme es nicht hin die die Werte und Dienste der Oberklasse zu übernehnen.
 

temi

Top Contributor
Nein, die Dienste getroffen und zeichne muss ich in die jeweiligen Unterklassen machen, da diese unterschiedlich sind.
Genau das habe ich ja geschrieben.
Java:
public abstract class Foo {
  
    public abstract void doSomething(); // abstrakt, darum hier keine Implementierung
}

public class Bar extends Foo {
  
    @Override
    public void doSomething() {
        // hier muss die Methode implementiert werden
    }
}
 

BluejLover

Neues Mitglied
Hallo,
ich arbeite zur Zeit an einem einfachen Grafikprojekt aus einem Übungsbuch, jedoch kommen ich nicht so ganz weiter und, da ich mir das ganze selbst aneignen muss, bin ich sehr blutiger Anfänger.
Hier die Aufgabenstellung und das, was ich bisher erarbeitet habe.



Java:
public class Hauptprogramm
{
    // Objekte
    Bildschirm derBildschirm;
    Tastatur dieTastatur;
    Maus meineMaus;
    Kreis meinKreis1, meinKreis2, meinKreis3;
    Kreis aktiverKreis;


    // Konstruktor
    public Hauptprogramm()
    {
        derBildschirm = new Bildschirm(900, 900);
        meineMaus = new Maus();
        dieTastatur= new Tastatur();  
        meinKreis1 = new Kreis(350, 350, 25, Farbe.BLAU);
        meinKreis2 = new Kreis(50, 50, 15, Farbe.ROT);
        meinKreis3 = new Kreis(200, 200, 35, Farbe.GRUEN);       
        aktiverKreis = meinKreis1;
        aktiverKreis.aktiviere();
    }

    // Dienste
    public void fuehreAus()
    {
        // Aktionsteil
        do
        {            
            //Entfernen des alten aktiven Kreises*Auswahl des Neuen
           
            if (meineMaus.istGedrueckt())
            {   aktiverKreis.deaktiviere();              
                if (meinKreis1.getroffen(meineMaus.hPosition(), meineMaus.vPosition()))
                    aktiverKreis = meinKreis1;                   
                else if (meinKreis2.getroffen(meineMaus.hPosition(), meineMaus.vPosition()))
                    aktiverKreis = meinKreis2;                   
                else if (meinKreis3.getroffen(meineMaus.hPosition(), meineMaus.vPosition()))
                    aktiverKreis = meinKreis3;                   
                aktiverKreis.aktiviere();
            }

            //Bewegung des aktiven Kreises + Ändern des Tastatur-Puffers  
            if (dieTastatur.wurdeGedrueckt())
            {
                switch (dieTastatur.zeichen())
                {
                    case Zeichen.PFEILRECHTS: aktiverKreis.bewegeUm(5,0); break;
                    case Zeichen.PFEILLINKS: aktiverKreis.bewegeUm(-5,0); break;
                    case Zeichen.PFEILOBEN: aktiverKreis.bewegeUm(0,-5);  break;
                    case Zeichen.PFEILUNTEN: aktiverKreis.bewegeUm(0,5); break;
                }
                dieTastatur.weiter();
            }
        } while (!meineMaus.doppelKlick());   
        // Aufraeumen
        derBildschirm.gibFrei();
        dieTastatur.gibFrei();
        meineMaus.gibFrei();
        meinKreis1.gibFrei();
        meinKreis2.gibFrei();
        meinKreis3.gibFrei();
        aktiverKreis.gibFrei();
    }

Hier beginnt die abstrakte Klasse

Java:
public abstract class Figur
{
    // Bezugsobjekte
   
    // Attribute

    // Konstruktor
    public Figur()
    {       
    }
    // Dienste  
   
    private void loesche()
    {
        hatStift.radiere();
        this.zeichne();
        hatStift.normal();
    }
   
    public void bewegeUm(int pH, int pV)
    {
        this.loesche();
        hatStift.bewegeBis(hatStift.hPosition() + pH,
            hatStift.vPosition() + pV);
        this.zeichne();
    }
   
    public void aktiviere()
    {
        this.loesche();
        hatStift.setzeLinienbreite(3);
        zAktiv = true;
        this.zeichne();
    }

    public void deaktiviere()
    {
        this.loesche();
        hatStift.setzeLinienbreite(1);
        zAktiv = false;
        this.zeichne();
    }
   
    private void gibFrei()
    {
        hatStift.gibFrei();
    }

Hier das Quadrat:
Java:
public class Quadrat extends Figur
{
    // Bezugsobjekte
    public Buntstift hatStift;

    // Attribute
    private int zGroesse;
    private boolean zAktiv;

    // Konstruktor
    public Quadrat(int pH, int pV, int pGroesse, int pFarbe)
    {        
        hatStift = new Buntstift();
        hatStift.bewegeBis(pH, pV);
        hatStift.setzeFarbe(pFarbe);
        zAktiv = false;
        zGroesse = pGroesse;       
        this.zeichne();
    }
    // Dienste
     
    private void zeichne()
    {
        hatStift.zeichneRechteck(zGroesse, zGroesse);
    }

    public boolean getroffen(int pH, int pV)
    {
         return (pH - hatStift.hPosition())*(pH - hatStift.hPosition())
                <= zGroesse*zGroesse;
    }

Ich weiß, dass das viel und unübersichtlich ist, aber ich komme echt nicht weiter...ich arbeite (wie im Titel) übrigens mit Blue J!
Also was muss ich tun? Die Klasse Kreis ist fertig...
Hey Ich habe derzeit genau dasselbe Problem hast du eventuell die Lösung für alle Aufgaben
 

Ähnliche Java Themen

Neue Themen


Oben