Liskov Prinzip

balboso

Neues Mitglied
Hallo liebe Forumgemeinde,

ich bin blutiger Anfänger und versuche gerade das Liskovprinzip anhand eines selbstgeschriebenen Programms nachzuvollziehen, nur irgendwie haut das nicht hin:
Java:
package Kohlekraftwerk;

public class AMain {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Kohle kohle = new Kohle();
        Steinkohle steinkohle = new Steinkohle();
        Brennstoff brennstoff = new Brennstoff();
        Object o = new Object();
       
       
        Kohlekraftwerk kw1 = new Kohlekraftwerk();
        Steinkohlekraftwerk skw = new Steinkohlekraftwerk();
        KohleUndOelOfen kuoofen = new KohleUndOelOfen();
       
        System.out.println("Kohlekraftwerk");
        kw1.burn(kohle);
        kw1.burn(steinkohle); // Steinkohle Untertyp von Kohle
        kw1.burn(steinkohle);
        // kw1.burn(brennstoff); Übergabeparameter wird erst in Uklasse abgeschwächt
        System.out.println("KohleUndOelOfen");
        kuoofen.burn(brennstoff);
        kuoofen.burn(kohle);
        System.out.println("Steinkohlekraftwerk");
        skw.burn(steinkohle);
        skw.burn(kohle);
        // skw.burn(brennstoff);

    }

}
---
package Kohlekraftwerk;

public class Kohlekraftwerk {
    private Kohle kohle = new Kohle();
   
    public void burn(Kohle k){
        kohle=k;
        System.out.println("Brennstoff verbrannt: "+kohle);
    }

    public Kohle getKohle() {
        return kohle;
    }

    public void setKohle(Kohle kohle) {
        this.kohle = kohle;
    }

}
---
package Kohlekraftwerk;

public class KohleUndOelOfen extends Kohlekraftwerk {

//  Nicht Überschreiben sondern Überladen
//    public void burn(Brennstoff b){
//        //super(b); kann nicht übergeben werden
//       
//    }
   
// Überschreiben
   
    public void burn(Brennstoff b){
//        super.setKohle(b); Zuweisung nicht möglich
    }
   

}

---
package Kohlekraftwerk;

public class Steinkohlekraftwerk extends Kohlekraftwerk {
   
    public void burn(Steinkohle steinkohle){
        //super(steinkohle); Verstoß gegen Liskov
       
        setKohle(((Kohle) steinkohle));
       
       
       
       
    }

}
---

package Kohlekraftwerk;

public class Kohle extends Brennstoff {

}

---

package Kohlekraftwerk;

public class Brennstoff {
   
}

---

package Kohlekraftwerk;

public class Steinkohle extends Kohle {
   

}
Kohlekraftwerk
Brennstoff verbrannt: Kohlekraftwerk.Kohle@2a139a55
Brennstoff verbrannt: Kohlekraftwerk.Steinkohle@15db9742
Brennstoff verbrannt: Kohlekraftwerk.Steinkohle@15db9742
KohleUndOelOfen
Brennstoff verbrannt: Kohlekraftwerk.Kohle@2a139a55
Steinkohlekraftwerk
Brennstoff verbrannt: Kohlekraftwerk.Kohle@2a139a55

Gemäß Liskovschen Substitutionsprinzip ist es erlaut, in abgeleiteten Klassen die Vorbedingungen der Methoden abzuschwächen. Dies habe ich in der Klasse KohleUndOelOfen versucht, nur ist es nicht möglich, Brennstoff, der ein allgemeineres Objekt als Kohle ist, der Klasse zu übergeben. Wahrscheinlich habe ich das Prinzip falsch verstanden. Vielleicht könnt ihr mir helfen. Sehe meinen Fehler nicht.
 
K

kneitzel

Gast
Wenn Du eine klasse ableitest, dann kannst Du eine Methode so verändern, dass eine Oberklasse übergeben werden kann. Deine burn Methode ist da also richtig. Aber natürlich kannst Du den Brennstoff nur dann der Kohle zuweisen, wenn es sich dabei um Kohle handelt. Um mit Öl umgehen zu können, musst Du die Klasse natürlich noch weiter erweitern. So könnte der neue Ofen auch einen öltank haben und wenn Du Öl als Brennstoff hinzugefügt wird, dann kommt das Öl in den Öltank. Und wenn keine Kohle da ist, dann muss Deine neue Klasse natürlich wissen wie sie an das Öl heran kommt und wie es das Öl verbrennen kann. Da nützt die vorhandene Klasse natürlich nicht wirklich.
 

balboso

Neues Mitglied
Danke für die Antwort! Hab gerade nochmal bißchen rumgebastelt, so würde es funktionieren, in dem ich den Brennstoff caste in Kohle:
Java:
public void burn(Brennstoff b){
        Kohle bb = new Kohle();
        bb = (Kohle) b;
        super.setKohle(bb);
    }
Meine Frage: Was passiert mit dem Objekt einer Oberklasse (Brennstoff b), wenn man es in ein Objekt der Unterklasse (Kohle bb) castet? Wird das ehemalige Oberklasseobjekt um überladene/überschriebene/zusätliche Methoden + Attribute der Unterklasse ergänzt?
 

VfL_Freak

Top Contributor
Mein, natürlich nicht!
Du kannst immer nur abgeleitete Objekte ändern - man spricht dann auch von einer Erweiterung!

Es wäre ja auch fatal!
Nur weil Du in einer abgeleiteten Klasse bsp. eine neue Methode oder Attribut hinzufügst, willst Du das ja nicht auch bei allen anderen Ableitungen haben !!

Gruß Klaus
 

Ähnliche Java Themen

Neue Themen


Oben