C# Interfaces: Wofür?

Messinho

Cadet 4th Year
Registriert
Feb. 2012
Beiträge
114
Hallo,

die Frage steht schon im Titel, WOFÜR brauche ich Interfaces.
Ich habe normale Mutterklassen um polymorph zu handeln. z.B.:
Code:
// Mutterklasse
public class Fahrzeug 
{
      public void Fahren()
      {
              //mach Was
       }
}
Code:
// Kindklasse
public class Auto : Fahrzeug
{
        //Auto kann nun fahren
}
Code:
// Beispiel für Polymorphie
Fahrzeug[] meineFahrzeuge = new Fahrzeug[10];

for(int i = 0; i < 10; i++)
{
       meineFahrzeuge[i].Fahren();
}

So nun kann man schön sehen, dass
1.) Vererbung möglich ist
2.) Polymorphie funktioniert
3.) und wenn man nicht möchte, dass jemand die Klasse Fahrzeug instanziiert, macht man sie abstract.
So nun zurück zu der Frage, wozu Interfaces? Wenn möglich bitte mit einfachem Beispiel.
 
Hi,

das was du da machst ist keine Mehrfachvererbung. Mehrfachvererbung bedeutet, dass eine Klasse von z.B. zwei Basisklassen abgeleitet wird. Genau das darfst du in C# aber eben nicht, daher verwendet man Schnittstellen als Workaround, um eine Quasi-Mehrfachvererbung zu erzielen.

Einfach mal hier lesen.

Da eine Klasse aber nur über eine Basisklasse verfügen kann, können solche abgeleiteten Klassen nicht mehr unter einer benutzerdefinierten abstrakten Basisklasse angeordnet werden. In Sprachen, die Mehrfachvererbung unterstützen, können einer Klasse in einem solchen Fall einfach mehrere Basisklassen zugeordnet werden, in C# ist dies jedoch nicht möglich.

Die Lösung liegt in sogenannten Schnittstellen, die abstrakten Klassen sehr ähnlich sind, da sie ebenfalls Methodendefinitionen enthalten, aber im Gegensatz zu Klassen mehrfach vererbt werden können. Die einzige Einschränkung einer Schnittstelle ist, dass sie keine Implementierung enthalten können, sondern auf die Methodendefinitionen beschränkt sind. Insofern entspricht eine Schnittstelle einer vollständig abstrakten Klasse.

VG,
Mad
 
Von Mehrfachvererbung habe ich auch überhaupt nicht gesprochen! Sind Interfaces also wirklich nur für die Mehrfachvererbung. Wenn die anderen Klassen das auch könnten, wo ist dann die Daseinsberechtigung. z.B. C++ Interfaces UND Mehrfachvererbung möglich mit normalen Klassen.
 
Hi,

Interfaces nutzt man für die Mehrfachvererbung in C#. In C# gibt es eben per Definition keine Mehrfachvererbung, jede Klasse kann nur von einer Basisklasse abgeleitet werden.

Wobei auch dein Beispiel für Polymorphie (also die Vielgestaltigkeit) etwas hinkt :) Du erzeugst dir nur ein Array of Fahrzeuge... wo da die Polymorphie sein soll verstehe ich nicht.

Schau dir mal die Beispiele hier an. Da wird es deutlicher. Du durchläufst einfach nur ein Array mit identischen Objekten und rufst die identische Methode auf. Ein explizites Beispiel für Polymorphie sehe ich daran nicht :)

Interfaces haben damit aber eigentlich nicht direkt was zu tun, daher ist mir nicht so klar, was damit bewiesen wäre. In C# ist jeder Typ polymorph. Daraus kannst du nicht schließen, dass du keine Interfaces brauchst :)

VG,
Mad
 
Zuletzt bearbeitet:
wo da die Polymorphie sein soll verstehe ich nicht
Die Polymorohie ist, dass ich die Fahrzeuge fahren lasse OHNE zur Compilezeit zu wissen was für ein Fahrzeug das ist. Könnte ein AUto sein oder ein Mottorad oder ein Fahrrad.

Aber, dann stelle ich die Frage anders. In C++ gibt es Mehrfachvererbung. WOZU Interfaces?
 
Hi,

das hast du komplett falsch verstanden :) DAS was du beschreibst ist KEINE Polymorphie. "Auto" oder "Motorrad" gibt es nicht, du erzeugst nur Objects of Fahrzeug! Das ist keine Polymorphie! Lies dir doch bitte die Beispiele durch, du bist viel zu sehr semantisch fixiert! Das Microsoft-Beispiel erklärt es sehr schon.

Schnittstellen sind einfach sehr komfortabel, wenn du einfach nur festlegen willst, welche Methoden oder Member eine Klasse beinhalten muss. Du stellst einfach sicher, dass Klasse A mindestens alle benötigten Methoden von Interface A bereitstellt, wenn es dieses korrekt implementiert. Nicht mehr und nicht weniger.

In C++ soll mit dem Interface keine Mehrfachvererbung gemacht werden sondern lediglich den implementierenden Klassen vorgeschrieben werden, welche Methoden zu implementieren sind. Im Gegensatz zu abstrakten Klassen ist eine Klasse die keine Methode aus der Interface-Definition implementiert nämlich nicht auch ein Interface sondern schlicht nicht erlaubt. Wenn eine Klasse die Methoden aus der abstrakten Klasse nicht implementiert ist diese jedoch ebenfalls abstrakt.

Interfaces enthalten im Gegensatz zu abstrakten Klassen überhaupt keine implementierten Methoden - alle Methoden existieren nur als Funktionssignaturen. Eine Schnittstelle legt somit eine Menge von Methoden fest, die bei einem Objekt angwendet werden können. Abstrakte Klassen dagegen enthalten zum Teil bereits implementierte Methoden, um den von ihnen abgeleiteten Klassen ein gewisses Grundverhalten mitzugeben.

VG,
Mad
 
Zuletzt bearbeitet:
OK. Danke. Jetzt ist mir klarer. Was mich nur beunruhigt ist, dass ich das mit der Polymorphie falsch verstanden habe :(
 
Hi,

das ist doch kein Beinbruch! Einfach mal ein paar Beispiele durcharbeiten, das hast du in einer halben Stunde raus! :)

VG,
Mad
 
Madman1209 schrieb:
DAS was du beschreibst ist KEINE Polymorphie. "Auto" oder "Motorrad" gibt es nicht, du erzeugst nur Objects of Fahrzeug! Das ist keine Polymorphie!
Naja, im dritten Beispiel des TE wird eigentlich nur ein Objekt erzeugt; ein Array vom Typ Fahrzeug. Da es nicht gefüllt wird, gibts bereits beim ersten Durchlauf eine NullReferenceException. Polymorphie gibts so zwar keine, aber kategorisch ausgeschlossen ist es auch nicht.

Das Beispiel kann modifiziert sehr wohl zur Demonstration von Polymorphie dienen:
Code:
Fahrzeug[] meineFahrzeuge = new Fahrzeug[3];

meineFahrzeuge[0] = new Fahrzeug();
meineFahrzeuge[1] = new Auto();
meineFahrzeuge[2] = new Motorrad();
 
for(int i = 0; i < 3; i++)
{
    meineFahrzeuge[i].Fahren();
}

Beim Aufruf in Zeile 9 kann dann sehr wohl Polymorphie im Spiel sein (zumindest für i = 1 und i = 2), weil "meineFahrzeuge" für den Compiler nur Fahrzeuge enthält.
Es gibt natürlich didaktisch deutlich bessere Beispiele aber technisch ist es korrekt. :)
 
Ja das instanzieren habe ich mir gespart, weil es ja nur ein Beispiel sein sollte. Aber ich habe genau das gemeint was CadillacMan als beispiel hat. Ist das nun Poliymorphie oder nicht. BIN VERWIRRT !
 
Kurz und knapp: ja, ist es.

Polymorphie bedeutet schlicht weg nur, dass ein Object als sein eigener Typ, sein Base-Typ oder als irgendein implementierter Interface-Typ benutzt werden kann.

Bsp.

Code:
protected abstract class Fahrzeug { ... }
Code:
protected class Auto : Fahrzeut { ... }
Code:
protected class Motorrad : Fahrzeug { ... }

Code:
Auto auto = new Auto();
bool isAuto = auto is Auto; // true
bool isMotorrad = auto is Motorrad; // false
bool isFahrzeug = auto is Fahrzeug; // true

Und wie Madman schon sagte, in C# ist jeder Typ polymorph und zwar zum Typen object.
Code:
Auto auto = new Auto();
Fahrzeug fahrzeug = (Fahrzeug)auto;
bool isObject = fahrzeug is object; // true, und zwar für alles was du anstelle für fahrzeug einsetzt.

Zu deiner Frage bzgl. Interfaces. Vlt. mal ein anderes Beispiel. Was ist ein Trike?
Code:
public class Trike : Fahrzeug { ... }

Obiges ist erstmal richtig. Folgendes ist aber auch nicht falsch:

Code:
public class Trike : Auto { ... }
// oder
public class Trike : Motorrad { ... }

Du siehst schon, am besten beschreibt man ein Trike als
Code:
public class Trike : Auto, Motorrad { ... }

Aber genau das geht nicht. Mehrfachvererbung ist in C# so nicht möglich.
Also wäre es klüger wie folgt vorzugehen

Code:
public interface IFahrzeug { ... }
public interface IAuto : IFahrzeug { ... }
public interface IMotorrad : IFahrzeug { ... }
// und nu:
public class Auto : IAuto { ... }
public class Motorrad : IMotorrad { ... }
public class Trike : IAuto, IMotorrad { ... }

// oder anders:
public interface ITrike : IAuto, IMotorrad {... }
public class Trike : ITrike { ... }

Verstanden? :D
 
Zuletzt bearbeitet:
OK! NUn habe ich es verstanden. Danke für die Hilfe.
Nur EINE Frage ist nicht geklärt.
In C++ ist Mehrfachvererbung möglich. Wozu Interfaces in C++?
 
Messinho schrieb:
In C++ ist Mehrfachvererbung möglich. Wozu Interfaces in C++?
In C++ gibts eigentlich keine Interfaces. Zumindest nicht als eigenes Sprachkonstrukt wie in C# oder Java.
C++-Interfaces sind eigentlich nur abstrakte Klassen die nur abstrakte Methoden enthalten.
 
Zurück
Oben