Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich habe gerade meine Studium in Informatik gestartet. Hier lerne ich u.a. Java.
Hier ist die Frage aufgekommen ob sich jedes Interface durch abstrakte Klassen ersetzen lässt. Ich denke das Thema habe ich soweit verstanden und in trivialen Fällen lässt sich das auch realisieren.
Code:
interface size
{
int getWidth();
int getHeight();
}
Code:
public class image implements size
{
int width;
int height;
public int getWidth() {
return width;
}
public int getHeight() {
return width;
}
}
Nun die Realisierung mit abstrakten Klassen:
Code:
public abstract class size
{
public abstract int getWidth();
public abstract int getHeight();
}
Code:
public class image extends size
{
int width;
int height;
public int getWidth() {
return width;
}
public int getHeight() {
return width;
}
}
Ich denke, dass beide Implementierungen das gleiche realisieren.
Jetzt frage ich mich nur, ob das wirklich in allen Fällen Interfaces auf diesem oder einen anderen Weg ersetzen lassen, oder ob es doch spezielle Fälle gibt, bei denen nur Interfaces zu nutzen sind.
Wäre euch sehr dankbar für eine kleine Aufklärung!
theoreitsch könnte man jedes interface durch eine abstrakte klasse ersetzen, würd ich ma so sagen, aber damit machst du ja den sinn der interfaces kaputt, nämlich einen ersatz zur mehrfachvererbung. also meine antwort wär: ja, aber is sinnlos.
klar: jedes Interface lässt sich durch eine passende abstrakte Klasse ersetzen, kein Problem; schwierig wirds nur für die "Anwender" dieser Interfaces/Klassen
es ist halt so, dass man in Java nur von EINER Klasse erben kann...
wenn du also so vor dich hinprogrammierst und etwas in der Hand hast, dass - aus welchen Gründen auch immer - schon von FooBarObject erbt, dann kannst du ohne Probleme ein weiteres Interface "size" implementieren...aber die abstrakte Klasse ist dann "aussen vor"
<SenfModus=ON>
Technisch gesehen geht das sicherlich mit der Einschränkung, daß man irgendwann feststellt, daß Java (leider) keine Mehrfachvererbung vorsieht.
Aus Design-Sicht haben aber beide Konzepte ihre Berechtigung die für unterschiedliche Zwecke eingesetzt werden. Wer nun daher kommt, und einfach so aus Interfaces abstrakte Klassen macht (ohne dazu einen designtechnischen Grund zu haben), der hat wohl von OO-Design keine Ahnung :bae:
<SenfModus=OFF>
Ich danke euch erstmal für die zahlreichen Antworten.
Naja, dass es oftmals wenig sinnvoll ist Interfaces durch abstrakte Klassen zu ersetzen war mir klar. Leider musste ich an der Uni schon öfters feststellen dass hier vieles gemacht wird was nicht unbedingt sinnvoll ist.
Naja - da muss ich aber mal intervenieren - gerade an der Uni wird sowas bestimmt nicht gemacht. Das Interfaces Mehrfachvererbung zulassen, Klassen in Java jedoch nicht, ist für die Theorie doch sehr interessant - das erfordert ja auch, dass man sich halt entsprechend Gedanken darüber macht, wie und wann man Interfaces einsetzen muss/kann und wann ne abstrakte Klasse mal ganz sinnvoll ist...
schlecht, weil sie den "Anwender" zwingen von dieser zu erben und das nicht immer möglich ist
gut, weil sie Methodenimplementierungen enthalten können, d.h. der "Anwender" diese nicht mehr schreiben muss
Interfaces sind
gut, weil man mehrere davon erweitern kann
schlecht, weil ALLE Methoden eines Interfaces implementiert werden müssen
IMHO ist es doch meistens klar: wenn es keine sinnvollen Defaultimplementierungen gibt, dann nimmt man IMMER ein Interface anstatt einer abstrakten Klasse
wenn es solche gibt, kann man immer noch ein Interface definieren UND eine abstrakte Klasse, die dieses Interface implementiert und eben ein paar Methoden gleich mitimplementiert (siehe WindowsAdapter usw.)
Ich sag mal, wenn ich mir ein Design überlege, in dem mehrere Klassen am Ende diegleichen Interfaces implementieren, es aber keinen Sinn macht denen eine gemeinsame instanziierbare Basisklasse zu verpassen, bastel ich mir eine abstrakte Klasse welchen emien Interfaces implementiert und lasse meine Zielklassen von dieser erben.