Abstrakt oder Interface?

Hi,

wir sollen eine Verkehrsplanungssoftware erstellen. Ich habe verschiedene Bausteine > Landschaftsformen > Verkehrswege > Verkehrsteilnehmer.

Meine Frage: Bei Landschaftsformen, dachte ich mir eine Oberklasse zu erstellen und z.B. Wiesen, Bäume, Häuser usw. davon abzuleiten, da sie keine zusätzlichen Funktionen haben.
Bei Verkehrswege, wie Strassen und Schienen und Verkehrsteilnehmer z.B. Autos, Fussgänger, Bahn, dachte ich mir eine abstrakte Klasse zu machen oder ein Interface, weil jeder unterschiedliche Funktionen hat.

Was ist besser geeignet dafür, abstract oder interface?
Was ist aus programmiertechnischer Sicht eigentlich der Unterschied?
Vielleicht an einem kurzen Beispiel erklärt?

Info > in jedem Objekt sollen verschieden Sachen gespeichert werden, wie Richtung, Geschwindigkeit usw. und das Ganze soll dann in einer Simulation abspielbar sein, mit Ampeln, Bahnübergang usw.

Gruß

Der unterschied zwischen einer abstracten klasse und einem Interface ist gigantisch.Zumindest was die „mächtigkeit“ angeht :wink:

Ein Interface ist eine Abstrakte klasse. Beide geben Variablen und Methoden vor, die hinterher ausprogrammiert werden sollen.

Der unterschied besteht darin, das eine Klasse nur eine andere Klasse vorimplementieren kann. Jedoch kann eine Klasse unendlich viele Interfaces implementieren.

Wird ein Interface implementiert, so muss jede im Interface beschriebene Methode „Ausprogrammiert“ werden.

Methoden die Ignoriert/nicht implementiert werden, führe zu einem Fehler.

Es ist immer besser Interfaces zu verwenden, da wie schon beschrieben mehrere Interfaces in eine klasse übernommen werden können.

Hi

Es ist immer besser Interfaces zu verwenden, da wie schon
beschrieben mehrere Interfaces in eine klasse übernommen
werden können.

So pauschal würde ich das nicht sagen. Ich ziehe in der Regel Vererbung den Interfaces vor und benutze Interfaces nur, wenn ich eine Art Mehrfachverebung brauche. Das erspart einfach Arbeit, besonders, wenn man mehrere Klassen mit gleichen oder ähnlichen Methoden hat, eben weil bei überschrieben Klassen die Methoden nicht ausprogrammiert werden müssen.

Vielleicht an einem kurzen Beispiel erklärt?

Ich saug mir mal was aus den Fingern…

public class GameObject {

private static int idCount = 0;

private String name;
public final int id;

public GameObject(String string) {
if (string == null || string.isEmpty())
throw new IllegalArgumentException();
name = string;
id = idCount ++;
}

public String getName() {
return name;
}

public void setName(String string) {
if (string != null && !string.isEmpty())
name = string;
}
}
public interface Buyable {
public int getCost();
}public class Item extends GameObject implements Buyable {

private int price;

public Item(String string, int cost) {
super(string);
price = cost;
}

public int getCost() {
return price;
}
}

… oder sowas halt.
Wie gesagt, das praktische ist, dass beispielsweise alle von GameObject abgeleitete Klassen eine eindeutige ID haben. Mit Interfaces wäre das nicht möglich.

LG, Keks

Danke an euch beide für die Antworten.

Gruß

Also ich persönliche sehe es so:
Interfaces definieren einen Typ
Abstrakte Klassen implementieren ein Standard- bzw. Default-Verhalten in einer Klasse, Vererbungsstruktur oder eines Typs (Interface-Implementierung)

In deinem Fall würde ich alle Objekte mit seinen Attributten auf Papier schreiben. Danach würde ich sie nach fachlichen Gesichtpunkten gruppieren. Dann alle gleichen Attribute durch eine klevere Vererbung „eleminieren“.

zb:

//definiere den Typ Landschaftsform
public interface Landschaftsform
{
 public Integer getId();
 public void setId(Integer id);
}

//implementiere die ID zum speichern aller Landschaftsformen 
public abstract class AbstractLandschaftsform implements Landschaftsform
{
 public Integer id;
 public AbstractLandschaftsform()
 {
 id = new Integer(0);
 }

 public Integer getId()......
 public void setId(Integer id).....
}

//definiere den Typ Wald
public interface Wald extends Landschaftsform
{
 //allgemeine Waldmethoden
}

//implementiere die methoden die alle Waldformen brauchen
public abstract class AbstractWald extends AbstractLandschaftsform implements Wald
{
 //implementiere alle Wald-Methoden mit den Standard-Verhalten
}

//ein Interface für die konkrete Waldlandschaftsform Laubwald, um
//implementierung von den benutzenden klassen abzutrennen
public interface Laubwald extends Wald
{
 //alle methoden die so ein Laubwald braucht
}

// die konkrete implementierung eines Laubwaldes
//diese Klasse wird in der Struktur instanziert (ist nicht abstrakt)
public class Laubwald extends Wald implements Laubwald
{
 //implementierung alle Laubwald-Methoden
 //evtl. überschreiben einiger Methoden der 
 //abstrakten Klassenstruktur, da in diesem konkreten Fall
 //ein anderes Verhalten gewünscht ist.
}

Mit fachlichem gruppieren meinte ich so etwas:

Verkehrsweg
 Straße
 Landstraße
 Autobahn
 Schnellstraße
 Schiene
 Nahverkehr
 Hochgeschwindigkeit
 Wasserstraßen