Forum
Tipps
News
Menu-Icon

Abstrakte Klasse vs Interface & Liskov Substitutionsprinzip

Hallo,
bin gerade bei meiner Klausuvorbereitung, jedoch stoße ich auf ein paar Probleme. Und zwar wurden mir ein paar Tipps gegeben, dass wohl so Fragen kommen:
Was ist der unterschied zwischen einer abstrakten Klasse und ein Interface?
Wo werden abstrakte Klassen und Interface sinnvoll eingesetzt?
Und das Liskov Substitutionsprinzip beschreiben. Vorbedingungen und Nachbedingungen mit Methoden und Klassevariationen.

Ist ja nicht so, dass ich nichts getan habe, also mein derzeitiger Stand von den Sachen ist.

Von abstrakten Klasse kann ich keine objekte Erzeugen, und Interfaces werden zur Erweiterungszwecken implementiert, z.B. interface cloneable, aber was soll ich da schreiben, was die Unterschiede sind?
Desweiteren weiß ich bei den abstraken Klassen keine Anwendungsgebiete, bei Interfaces ist es bei Java AWT mit den ganzen Listenern etc, kann man das so schreiben?

Zu dem Liskov Substitutionsprinzip verstehe ich überhaupt nicht was mit den Vor.- bzw Nachbedingungen gemeint ist und Klassenvariationen?
Habe das Prinzip bis jetzt so verstanden, dass es besagt, dass eine Unterklasse immer auch da eingesetzt werden kann wo die Oberklasse erwartet wird.

Wäre sehr nett wenn mir bei den Fragen jmd weiterhelfen könnte.
 


Antworten zu Abstrakte Klasse vs Interface & Liskov Substitutionsprinzip:

Zitat
Was ist der unterschied zwischen einer abstrakten Klasse und ein Interface?

Bei der abstrakten Klasse muss man eine andere von der abstrakten ableiten, und die abstrakten Methoden zu Ende schreiben. Ein Interface muss implementiert werden, und beihnhaltet methoden die ueberschrieben werden muessen.
Man kann immer nur 1 Klasse vererben, aber mehrere Interfaces auf einmal implementieren!

Man kann dann diese 2 Sachen zusammenfassen.
Ein kleines Codebeispiel, zur demonstration:
public class Abstract_Iface {

public static void main(String[] args) {
ZeichenObjekt[] c = new ZeichenObjekt[] {
new Wuerfel(),
new Kugel(),
//Und jetzt ein Sondefall, was auch geht
new ZeichenObjekt() {
protected void paint(Graphics g) {
g.drawLine(0, 0, 20, 20);
}
}
};
}
}

abstract class ZeichenObjekt {
protected abstract void paint(Graphics g);
}
class Wuerfel extends ZeichenObjekt {
protected void paint(Graphics g) {
g.drawRect(0, 0, 10, 10);
}
}
class Kugel extends ZeichenObjekt {
protected void paint(Graphics g) {
g.drawOval(0, 0, 10, 10);
}
}
Zur Erklaerung: Es werden 2 Klassen von der abstrakten Klasse abgeleitet. Diese muessen die abstrakten Methoden definieren.
Es wird mit
new ZeichenObjekt() {
protected void paint(Graphics g) {
g.drawLine(0, 0, 20, 20);
}
}
eine Anonyme Klasse erzeugt :-D. Diese hat keinen Namen, es wird aber die Methdoe ueberschrieben, deswegen ist es gueltig (kein sehr schoener Programmierstil).

Das war zu Abstrakten Klassen, jetzt kommen wir zu Interfaces:
Wir wollen jetzt den Wuerfel so machen, dass man sie auch mit Graphics2D Zeichnen kann. Aber auch NUR den Wuerfel.
Und das ist jetzt mit Interafaces um zu setzen:

public class Abstract_Iface {

public static void main(String[] args) {
Paint2D p = new Wuerfel();
}

}
class Wuerfel extends ZeichenObjekt implements Paint2D {
public void paint2D(Graphics2D g) {
g.drawRect(0, 0, 10, 10);
}
protected void paint(Graphics g) {
g.drawRect(0, 0, 10, 10);
}

}
interface Paint2D {
public void paint2D(Graphics2D g);
}
Hier ein Interface einzusetzen ist natuerlich sinnlos, da es nur eine Klasse ist (Wuerfel), haetten wir noch die Kugel dazugenommen haetten wir gleich in der Abstrakten Klasse das 2D zeichen nehmen koennen.
--> Stellen wir uns einfach vor es gaebe noch eine Mischung aus Wuerfel und Kugel, die auch 2D gezeichnet werden soll.

Dafuer sind Interfaces da^^ (denn in Java gibt es keine Mehrfachvererbung)

Zu dem Substitutionsprinzip kann ich dir nichts sagen, da hab ich irgendwas verpasst, ich frag mal google :-D

mfg. 
« Letzte Änderung: 09.02.08, 10:41:06 von Fuxi »

Ich habs glaube ich verstanden, das ist einfach nur das Vererbungsprinzip.
Im vorigen Post habe ich es schon verwendet:

ZeichenObjekt[] c = new ZeichenObjekt[] {
new Wuerfel(),
new Kugel(),
//Und jetzt ein Sondefall, was auch geht
new ZeichenObjekt() {
protected void paint(Graphics g) {
g.drawLine(0, 0, 20, 20);
}
}
};
Ich kann die paint-methode aufrufen indem ich c[0].paint(g); hinschreibe. Genauso koennte ich von einem Wuerfel direkt das ganze aufrufen, nur dann ist kann ich nur wuerfel arrays erzeugen. Mit der Vererbung kann ich verschiedene Klassen, die bestimmte Methoden der Vaterklasse haben, aufrufen und die wirkliche Klasse - die ich nicht sehen kann - kann diese ueberschreiben, und somit wird dann eben was anderes ausgefuehrt^^

Wobei das nur in Java so leicht ist, in anderen Sprachen (z.B. C++) muss man sowas selbst sagen, dass die ueberschriebene aufgerufen werden soll, sofern es eine gibt :-D   
« Letzte Änderung: 09.02.08, 10:59:18 von Fuxi »

« Was nehmt ihr zum Dokumentieren von Quellcode?Java Delegate Model Beschreibung? »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Genlock Interface
Die Genlocking-Technik ist vom Fernsehen her bekannt. Das Interface dient dem Mischen eines von einer Fernsehkamera aufgenommenen Bilds mit einer Computergrafik. Als Genl...

Interface
Der Begriff "Interface" bezeichnet in der Computertechnologie eine Schnittstelle. Es handelt sich um einen allgemeinen Begriff, der verschiedene Arten von Schnittstellen ...

Standardgateway
Das Standardgateway dient in einem Netzwerk ist das Gerät, das als Vermittler den Datenverkehr zwischen dem lokalen Netzwerk (wie einem Heim- oder Büronetzwerk)...