Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

10:uebungsaufgaben_generalisierung_spezialisierung [2018/06/03 22:53] (aktuell)
Zeile 1: Zeile 1:
 +====== Übungsaufgaben zur Generalisierung und Spezialisierung ======
  
 +===== Onlineshop =====
 +Ein Onlineshop vertreibt Handys und Notebooks verschiedener Hersteller und natürlich mit verschiedenen Ausstattungen. Von jedem Artikel wird auf der Name und der Preis gespeichert. Außerdem kann ein kurze Beschreibung zu diesen Informationen ausgegeben werden. Bei Handys darf der Hinweis, dass das Gerät nur mit einem Mobilfunkvertrag verkauft wird, nicht fehlen. Natürlich sollen auch spezielle Eigenschaften von Handys und Notebooks erfasst werden. ​ Ein Kunde, der zum Kauf seinen Namen, E-Mailadresse und seine Anschrift angeben muss, kann wegen des begrenzten Angebots nur einen Artikel in seinen Warenkorb legen. ​
 +
 +**1. Überlege dir unter dem Aspekt der Vererbung ein geeignetes Klassendiagramm zur Modellierung des Sachverhaltes.**
 +<hidden Tipp>
 +Überlege dir geeignete Attribute und Methoden für die Klassen Kunde, Artikel, Handy und Notebook </​hidden>​\\
 +
 +**2. Gehe nun von dem folgenden erweiterten Klassendiagramm aus und implementiere es.**
 +<hidden Klicke hier, um das Diagramm zu sehen>
 +{{:​10:​a1_klassendiagramm_onlineshop.png?​nolink|{{:​10:​a1_klassendiagramm_onlineshop.png?​200|}}
 +
 +<​note>​Hinweise
 +  * Die booleschen Attribute simlock bzw. dvdLaufwerk haben den Wert true, wenn ein Simlock vorliegt bzw. ein DVD-Laufwerk vorhanden ist.
 +  * Die Methode gibBeschreibung() gibt auf der Konsole einen Text zu Name und Preis aus. Bei Handys wird dieser um den Hinweis zu einem Mobilfunkvertrag ergänzt.
 +</​note>​
 +</​hidden>​\\
 +
 +<hidden Lösung zur Implementierung der Klassen>
 +<​code>​
 +
 +public class Kunde
 +{
 +    private String name;
 +    private String e_mail;
 +    private String anschrift;
 +    private Artikel artikel;
 +
 +    public Kunde(String nName, String nE_mail, String nAnschrift, Artikel nArtikel){
 +        name=nName;
 +        e_mail=nE_mail;​
 +        anschrift=nAnschrift;​
 +        artikel=nArtikel;​
 +    }
 +
 +    public String gibName(){
 +        return name;        ​
 +    }
 +
 +    public double gibPreis(){
 +        return artikel.gibPreis();​
 +    }
 +
 +    public void legeInWarenkorb(Artikel art){
 +        artikel=art;​
 +    }
 +}
 +
 +</​code>​
 +
 +<​code>​
 +public class Artikel
 +{
 +    protected String name;
 +    protected double preis;
 +
 +    public Artikel(String startName, double startPreis){
 +        name=startName;​
 +        preis=startPreis;​
 +    }
 +
 +    public String gibName(){
 +        return name;
 +    }
 +
 +    public double gibPreis(){
 +        return preis;
 +    }
 +
 +    void gibBeschreibung(){
 +        System.out.println("​Unser Angebot der Woche: " + name + " für nur " + preis + " €."​);​
 +    }
 +
 +}
 +</​code>​
 +
 +<​code>​
 +public class Notebook extends Artikel
 +{
 +    private double festplattengroesse;​
 +    private boolean dvdLaufwerk;​
 +
 +    public Notebook(String name, double preis, double fg, boolean dvd){
 +        super(name, preis);
 +        festplattengroesse=fg;​
 +        dvdLaufwerk=dvd;​
 +    }
 +
 +    public double gibFestplattengroesse(){
 +        return festplattengroesse;​
 +    }
 +
 +    public boolean gibDvdLaufwerk(){
 +        return dvdLaufwerk;​
 +    }
 +
 +    public void setzeLaufwerk(boolean dvd){
 +        dvdLaufwerk=dvd;​
 +    }
 +
 +    ​
 +}
 +</​code>​
 +
 +<​code>​
 +public class Handy extends Artikel
 +{
 +    private String betriebssystem;​
 +    boolean simlock;
 +
 +    public Handy(String name, double preis, String bs, boolean sl){
 +        super(name, preis);
 +        betriebssystem = bs;
 +        simlock =sl;
 +    }
 +
 +    public String gibBetriebssysetem(){
 +        return betriebssystem;​
 +    }
 +
 +    public boolean gibSimlock(){
 +        return simlock;
 +    }
 +
 +    public void setzeSimlock(boolean sl){
 +        simlock=sl;
 +    }
 +
 +    ​
 +}
 +
 +</​code>​
 +
 +
 +
 +</​hidden>​\\
 +
 +
 +
 +**3. Erkläre anhand des Klassendiagramms und dessen Implementierung die Begriffe //​erweitern//,​ //​überschreiben//​ und //​polymorph//​**
 +
 +<hidden Lösung>
 +  * Die Klassen Handy und Notebook erben von der Klasse Artikel. Sie sind von ihr abgeleitet. Sie erweitern die Klasse Artikel, weil sie neben den vorhanden Attributen und Methoden noch zusätzliche Attribute und Methoden besitzen.
 +  * Die Methode gibBeschreibung() der Klasse Handy überschreibt die gleichnamige Methode in der Klasse Artikel, da eine andere Implementierung notwendig ist.
 +  * Das Attribut //artikel// der Klasse Kunde ist polymorph. Es kann eine Referenz auf ein Objekt der Klasse Artikel haben oder auf ein Objekt der jeweiligen Unterklassen Handy und Notebook. Hinter dem Attribut //artikel// können sich also Objekte verschiedener Klassen verbergen.
 +</​hidden>​\\
 +
 +
 +**4. Durch Eingabe des  Gutscheincodes //​20130010//​ erhält der Käufer einen Preisnachlass von 10€. Ergänze die Klasse //kunde// um das Attribut //rabatt// sowie die Methode //void gutscheinCodeEingeben(int code)//. Passe die Methoden //​gibPreis()//​ an**
 +
 +<hidden Lösung>
 +<​code>​
 +   ​private double rabatt;
 +   ...
 +   void gutscheinCodeEingeben(int code){
 +      if(code=20130010){
 +         ​rabatt=10;​
 +      }
 +      else{
 +         ​rabatt=0;​
 +      }
 +   }
 +   
 +   ​public double gibPreis(){
 +      return preis-rabatt;​
 +   }
 +</​code>​
 +</​hidden>​\\
 +
 +
 +
 +**5. In der Klasse //kunde// soll die Methode //void entferneSimLock()//​ eingefügt werden. Welche Probleme ergeben sich dabei?.**
 +
 +<hidden Lösung>
 +Das Attribut //simLock// ist nur in der Unterklasse //Handy// vorhanden. Das Referenzattribut //artikel// der Klasse Kunde weist aber auf ein Objekt der Klasse //​Artikel//,​ die dieses Attribut bzw. eine geeignete Methode nicht besitzt.
 +</​hidden>​\\
Drucken/exportieren