Hallo liebe Forumgemeinde,
ich bin blutiger Anfänger und versuche gerade das Liskovprinzip anhand eines selbstgeschriebenen Programms nachzuvollziehen, nur irgendwie haut das nicht hin:
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.
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
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.