Vererbung Vererbung Frage

XardasX

Mitglied
Hallo zusammen,

ich muss heute schon das zweite mal nerven. Aber ich hab das ganze Thema Vererbung wohl doch nicht so gut verstanden wie ich dachte.

Es handelt sich um eine Klausuraufgabe. Es gibt Aufsätze die (im Kontext) entweder in einem Sammelband oder in einer Zeitschrift erscheinen. Sowohl Sammelbänder als auch Zeitschriften können als Druckwerke aufgefasst werden.
Die weiteren Infos zu den Klassen sind im Javacode.
Wichtig ist noch, dass zum Schluss eine Instanz von "Aufsätze" erzeugt werden soll.

Nun mein Ansatz:
Java:
public class Aufgabe4 {
	public static void main(String[] args) {
 	}
}

abstract class Druckwerke {

	public void Sammelband() {
	}
	
}

class Sammelband extends Druckwerke{
	private String Verlag;
	private String Herausgeber;
	public Sammelband (String Verlag, String Herausgeber){
		
	}
}

class Zeitschrift extends Druckwerke{
	private String Titel;
	private int Nummer;
	private String Erscheinungsjahr;
	public Zeitschrift (String Titel, int Nummer, String Erscheinungsjahr){
		
	}
}

class Aufsatz extends Druckwerke{
	private String Titel;
	private String Autor;
	public Aufsatz (String Titel, String Autor, String Verlag, String Herausgeber){
		this.Titel = Titel;
		this.Autor = Autor;
		super.Sammelband(Verlag, Herausgeber);
	}
}

Also ich hab irgendwie mal mitbekommen dass hier zB. "Zeitschrift" und "Sammelband" vom Typ "Druckwerke" sind. Also könnte man auch von "Aufsatz" auf diese Eigenschaften zugreifen weil ja alle vom gleichen Typ sind. Aber ich würde mich freuen wenn irgendjemand mir das hier genauer erklärt, wenn dieser Ansatz überhaupt irgendwas wert ist.

Ich freue mich über alle Tipps und Infos und vorallem über Infos bezüglich meines Ansatzes.

Viele Grüße
XardasX
 
Java:
abstract class Druckwerke {

	public void Sammelband() {
	}
	
}

class Aufsatz extends Druckwerke{
	private String Titel;
	private String Autor;
	public Aufsatz (String Titel, String Autor, String Verlag, String Herausgeber){
		this.Titel = Titel;
		this.Autor = Autor;
		super.Sammelband(Verlag, Herausgeber);
	}
}

Was macht die Methode Sammelband in der Klasse Druckwerke? Außerdem bildet eine Klasse immer 1 Objekt ab also ein Druckwerk und nicht Druckwerke.

Die Klasse Aufsatz hat meiner Meinung nach nichts zu tun mit der Aufgabenstellung (welche nicht ausführlich beschrieben ist hier). Ein Aufsatz ist kein Druckwerk ... also warum erweitert die Klasse Aufsatz die Klasse Druckwerk?

Ich nehme an die Aufgabestellung verlangt einfach das für das Verwalten einer Reihe von Aufsätzen eine gemeinsame Basisklasse (Druckwerk) für Sammelbänder bzw. Magazine

Java:
abstract class Druckwerk{
private Ausatz[] aufsaetze;
}

public class Sammelband extends Druckwerk{
.....
}

public class Aufsatz{
.....
}
 
Zuletzt bearbeitet:
Hallo Joose,

Java:
abstract class Druckwerke {
    public void Sammelband() {
    }   
}

Da muss wirklich die Methode raus. Das war eine Methode die eclipse automatisch angelegt hat. Tut mir leid.

Aufsatz erweitert Druckwerke, damit alle, dh. Aufsatz Zeitschrift und Sammelband, von einem Datentypen sind und so aufeinander zugreifen könne. Das ist mein Lösungsansatz. Der kann und wird wahrscheinlich falsch sein, da er ja auch nicht funktioniert.

Die Aufagebnstellung:
In der wissenschaftlichen Literatur können Aufsätze (mit Titel und Autor) in einem Sammelband (bestehend aus einem Verlag und Herausgeber) oder in einer Zeitschrift (haben einen Titel, Nummer und Erscheinungsjahr) erscheine. Sowohl Sammelband als auch Zeitschrift können als Druckwerke aufgefasst werden.

Nun sollen die Klassen entworfen werden. Konstruktoren implementiert werden und eine Methode "test" geschrieben werden, welche eine Instanz vom Typ "Aufsatz" erzeugt und alle entsprechenden Attribute initialisiert.

Ich hoffe diesmal ist es besser zu verstehen.
 
Die Aufagebnstellung:
In der wissenschaftlichen Literatur können Aufsätze (mit Titel und Autor) in einem Sammelband (bestehend aus einem Verlag und Herausgeber) oder in einer Zeitschrift (haben einen Titel, Nummer und Erscheinungsjahr) erscheine. Sowohl Sammelband als auch Zeitschrift können als Druckwerke aufgefasst werden.

Java:
public abstract class Druckwerk
{
    private ArrayList<Aufsatz> aufsaetze; //

    public Druckwerk(){
        aufsaetze = new ArrayList<Aufsatz>();
    }

    public void addAufsatz(Aufsatz neuerAufsatz){
        aufsaetze.add(neuerAufsatz);
    }

    public String toString(){
        String output = "";
        for(Aufsatz aufsatz : aufsaetze){
            ouput += aufsatz.toString();
        }
    }
}

public class Sammelband extends Druckwerk {
    private String herausgeber; // getter und setter hinzufügen
    
    private String verlag; //getter und setter hinzufügen

    public Sammelband(String verlag, String herausgeber){
        super();
        // attribute setzen
    }
}     

public class Aufsatz {
    private String titel; // getter und setter hinzufügen
    
    private String autor; //getter und setter hinzufügen

    public Autor(String titel, String autor){
        // attribute setzen
    }

    public String toString(){
        return getTitel() + " " + getAutor();
    }
}

Nun sollen die Klassen entworfen werden. Konstruktoren implementiert werden und eine Methode "test" geschrieben werden, welche eine Instanz vom Typ "Aufsatz" erzeugt und alle entsprechenden Attribute initialisiert.

Diese Methode test soll nur ein Objekt eines Aufsatzes erstellen? Dazu brauchst du nur die Klasse Aufsatz und die anderen 3 aber nicht!
 
Zuletzt bearbeitet:
Ich hoffe ich bin jetzt nicht total blind. Dann entschuldige ich mich im vorraus.

Aber wo ist denn da die Klasse "Zeitschrift"?
Und man kann bei deinem Code mit nur einer Instanz von Aufsatz auch alles andere initialisieren?
Also zB. auch Verlag oder das Erscheinungsjahr?

edit: wenn nur die eine Instanz erzeugt werden soll ist die Aufgabe klar.
Aber geht das denn auch so wie ich das verstanden habe? Also zB mit meinem Ansatz. Das ist für mich eigendlich viel interessanter.
Oder kann nur "linear" vererbt werden? Also so dass eine Seite der Kinder nicht auf die anderen Kinder zugreifen kann.
 
Zuletzt bearbeitet:
Ich hab das in ner ähnlichen Art und Weise wie Joose gelöst und in die Main Methode schonmal ein bisschen was zum Testen reingeschrieben.
Grob gesagt erzeugst du ein Objekt der Klasse Aufsatz das du dann einer der beiden Erscheinungsarten (Sammelband oder Zeitschrift) zuordnen kannst, wodurch du dann quasi ein Objekt der Klasse Sammelband erhältst in dem eine ArrayList mit den in dem Sammelband enthaltenen Aufsätzen enthalten ist.
Wenn ich die Aufgabenstellung richtig verstehe, musst du mit dem anlegen der Klasse nicht alle Variablen initialisieren, sondern nur die die du eben brauchst um einen neuen Aufsatz zu konstruieren.

Mfg
Markus

Java:
package Aufgabe4;

import java.util.ArrayList;

public class Druckerei {

    public static void main(String[] args) {
        Aufsatz a1 = new Aufsatz("Java - fuer Einsteiger", "Peter Mustermann"); //neue Aufsätze erzeugen
        Aufsatz a2 = new Aufsatz("Java - leicht gemacht", "Paul Mustermann");
        Sammelband s1 = new Sammelband("Musterverlag", "Gerd Muster"); //neuen Sammelband erzeugen
        s1.addAufsatz(a2); //Aufsatz a2 dem Sammelband zuordnen
        s1.addAufsatz(a1);
        System.out.println(s1); //gibt die toString() Methode von s1 aus
        for (Aufsatz aufsatz : s1.aufsaetze) { //gibt die in der ArrayList enthaltenen Aufsätze aus
            System.out.println(aufsatz);
        }

    }
}

abstract class Druckwerk {

    ArrayList<Aufsatz> aufsaetze = new ArrayList<>();

    ArrayList<Aufsatz> addAufsatz(Aufsatz aufsatz) {
        aufsaetze.add(aufsatz);
        return aufsaetze;
    }
}

class Sammelband extends Druckwerk {

    private String verlag;
    private String herausGeber;

    public Sammelband(String verlag, String herausGeber) {
        this.verlag = verlag;
        this.herausGeber = herausGeber;
    }

    public String getVerlag() {
        return verlag;
    }

    public String getHerausGeber() {
        return herausGeber;
    }

    @Override
    public String toString() {
        return "Sammelband{" + "verlag=" + verlag + ", herausGeber=" + herausGeber + '}';
    }

}

class Zeitschrift extends Druckwerk {

    private String titel;
    private int nummer;
    private int erscheinungsJahr;

    public Zeitschrift(String titel, int nummer, int erscheinungsJahr) {
        this.titel = titel;
        this.nummer = nummer;
        this.erscheinungsJahr = erscheinungsJahr;
    }

    public String getTitel() {
        return titel;
    }

    public int getNummer() {
        return nummer;
    }

    public int getErscheinungsJahr() {
        return erscheinungsJahr;
    }

    @Override
    public String toString() {
        return "Zeitschrift{" + "titel=" + titel + ", nummer=" + nummer + ", erscheinungsJahr=" + erscheinungsJahr + '}';
    }
}

class Aufsatz {

    private String titel;
    private String autor;

    public Aufsatz(String titel, String autor) {
        this.titel = titel;
        this.autor = autor;
    }

    public String getTitel() {
        return titel;
    }

    public String getAutor() {
        return autor;
    }

    @Override
    public String toString() {
        return "Aufsatz{" + "titel=" + titel + ", autor=" + autor + '}';
    }
}
 

Zurück
Oben