Autor Beitrag
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Di 22.09.09 21:46 
Hallo zusammen,

ich habe mir heute den Webcast zum Thema Interfaces von Daniel Walzenbach angeschaut, hat mir soweit gut gefallen. Ich denke ich habe soweit alles verstanden, ist ja recht anschaulich erklärt.

Hier mal mein Beispiel:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        button1.Click += new EventHandler(button1_Click);
    }

    private Dieselmotor dieselMotor = new Dieselmotor();
    private Ottomotor ottoMotor = new Ottomotor();

    void button1_Click(object sender, EventArgs e)
    {
        MotorStarten(dieselMotor);
    }
    void MotorStarten(IMotor motor)
    {
        motor.Starten();
    }
}

public interface IMotor
{
    void Starten();
}

public class Dieselmotor : IMotor
{
    public void Starten()
    {
        MessageBox.Show("Diesel gestartet");
    }
}
public class Ottomotor : IMotor
{
    public void Starten()
    {
        MessageBox.Show("Otto gestartet");
    }
}


Aber, ich habe keine Idee, wo und wann ich ein Interface sinnvoll einsetzen kann oder besser muss.

In dem Beispiel sehe ich keinen Vorteil, das Starten kann man auch gleich direkt über die Klasse machen.

Könnte mich bitte jemand erleuchten und mir zeigen wie man ein Interface sinnvoll nutzen kann?

_________________
Gruß
Christoph
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 22.09.09 22:03 
Stimmt, das Beispiel macht keinen Sinn :mrgreen: . Es gibt jedenfalls keinen wirklichen Grund, hier ein Interface statt einer abstrakten Klasse einzusetzen.

Für aussagekräftige Praxis-Beispiele würde ich die BCL selbst hernehmen, zum Bleistift IComparable oder ISerializable. Es wäre geradezu unmenschlich, jede Klasse, die sich auf die Festplatte serialisieren will, zu einer gemeinsamen Basisklasse zu zwingen. Und für IComparable fällt eine Basisklasse schon allein deswegen raus, weil man Structs wie int, Point, ... ja gar keine eigene Basisklasse verpassen kann.

_________________
>λ=
gfoidl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 157
Erhaltene Danke: 19

Win XP
C#, Fortran 95 - Visual Studio
BeitragVerfasst: Mi 23.09.09 00:45 
Hallo,

Zitat:
Könnte mich bitte jemand erleuchten und mir zeigen wie man ein Interface sinnvoll nutzen kann?

Eine Schnittstelle (Interface) definiert einen Vertrag den die Klasse oder Struktur nach außen aufweisen muss. D.h. es müssen die Methoden, Eigenschaften und Ereignisse implementiert werden.

Somit ist es möglich dass statt dem direkten Zugriff auf zB einer Methode eines Objekts auch über die Schnittelle zuzugreifen (wenn die Klasse die Schnittstelle implementiert). Der Vorteil ist dabei dass keine Bindung an eine konkrete Klasse herrscht sondern nur an die Schnittstelle.

Stell dir vor du willst Objekte vergleichen. Ohne Schnittstelle müsste für jedes Objekt der Typ geprüft werden und dann je nach Typ die entsprechende Methode aufgerufen werden. Dies mach keinen Sinn. Einfacher ist es eine Schnittstelle zu definieren welche die Methode für den Vergleich vorschreibt und den jede Klasse - deren Objekte verglichen werden sollen - implementieren muss. Somit entfällt die Typunterscheidung und der Code ist transparenter. (Anm.: Diese Schnittstelle ist in .net bereits dabei - IEquatable<T>.)

Dein Beispiel macht so wie es dasteht nicht viel Sinn. Aber stell dir ausgehend davon folgendes Szenario vor:
Du hast eine Klasse welche ein Datenbankservice-Objekt benötigt. Würde ein SQL-Server-Datenbankobjekt fest eincodiert läuft alles wunderbar bis zu dem Zeitpunkt wo es auch möglich sein sollte ein XML-Datenbankobjekt zu verwendet. Dann müsste der Code geändert werden. Dies kann umgangen werden wenn die Klasse eine Schnittstelle erwartet und alle Datenbankobjekt-Klassen die Schnittstelle implementieren. Dadurch entfällt eine Änderung des Codes der Klasse wenn der Datenbankserivce geändert werden soll. Es reicht wenn eine andere Instanz einer Klasse übergeben wird welche die Schnittstelle implementiert (dies nennt sich übrigen Depency Injetion da die Abhängigkeit nicht fest programmiert wird sonder per Argument an den Konstruktor übergeben wird oder per Eigenschaft gesetzt wird).


Ähnlich wie Schnittstellen sind (abstrakte) Basisklassen. C# (und alle anderen .net-Sprachen) unterstützen jedoch keine Mehrfachvererbung und somit scheidet eine Basisklasse für viele Fälle aus. Dann müssen Schnittstellen verwendet werden.
(Abstrakte) Basisklassen bietet die Möglichkeit Code zu besitzen und können somit als Vorlage für die ableiteten Klassen dienen (Template-Muster).


Hoffe dass das Thema etwas verständlicher wurde. :)


mfG Günther

_________________
Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Do 24.09.09 06:46 
Super, vielen Dank für die ausführliche Erklärung!

Schade, bisher hatte ich noch keinen Bedarf für ein Interface und habe auch aktuell nichts. Könnte auch sein das meine Programmierung einfach zu rudimentär ist. :oops: Aber vielleicht kommt ja in einem neuen Projekt eine Problemstellung, die mit einem Interface gelöst werden kann/muss. Vielen Dank noch mal!

_________________
Gruß
Christoph