Autor Beitrag
RalphHoffmann
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Di 09.06.15 12:49 
Hi @all,

ich bin im Rheinwerkbuch Visual C# 2012 bei den Interfaces angekommen. Und damit bei der Frage: Wozu?

Ich habe hier im Forum schon dazu recherchiert und gelesen...und noch immer nicht verstanden wozu es diese Interfaces braucht. Ein Interface erstelle ich außerhalb einer Klasse mit public interface [Name] daran schließt sich ein Anweisungsblock an. In diesem Block stehen jetzt Anweisungen, deren eigenen Anweisungsblöcke keine Code enthalten.

Hier das Beispiel aus dem Buch:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
public interface ICopy
{
   string Caption {get; set;};
   void copy();
}

Da frage ich mich: Hä? Wozu? Wenn das quasi leerer Code ist, der zu nix zu gebrauchen ist und ich in meiner Klasse, die dieses Interface nutzt (implementiert), die eigentliche Funktion erst schreiben muss? Im Buch wird das so gezeigt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
class Document : ICopy
{
    public void ICopy()
    {
        Console.WriteLine("Das Dokument wird kopiert.");
    }
    public string Caption
    {
        get{ [...] }
        set{ [...] }
    }
    [...]
}


Ich muss also in jeder Klasse den alles neu Programmieren? Und da isse wieder, die Frage: WOZU? :-)

Kann mir das mal jemand mit gaaaaaanz einfachen Worten oder Beispielen verständlich machen?

Beste Grüße
Ralph

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Di 09.06.15 14:02 
Hallo,

Interfaces heißen in deutsch "Schnittstellen". Und genau dafür sind sie gut. Wenn du z.B. eine Klasse hast, die bestimmte Methoden eines Typs aufrufen muss, den Typ aber nicht kennen muss, kannst du Interfaces verwenden:
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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
public interface IOperation
{
    string Name { get; }    

    double Compute(double a, double b);
}

public class Sum : IOperation
{
    public string Name { get { return "Sum"; } }

    public double Compute(double a, double b)
    {
        return a + b;
    }
}

public class Product : IOperation
{
    public string Name { get { return "Product"; } }

    public double Compute(double a, double b)
    {
        return a * b;
    }
}

public class Difference : IOperation
{
    public string Name { get { return "Difference"; } }

    public double Compute(double a, double b)
    {
        return a - b;
    }
}

public static class MainClass
{
    public static void Main(string[] args)
    {
        IOperation adder = new Sum();
        IOperation multiplier = new Product();

        Console.WriteLine(Calculate(adder, 1020));
        Console.WriteLine(Calculate(multiplier, 1020));
    }

    static string Calculate(IOperation operation, double a, double b)
    {
        string s = "Operatrion kind: " + operation.Name + "\n" + 
                   "Result: " + operation.Compute(a, b);
    }
}

Ich hoffe du siehst was ich meine.
Die Methode Calculate(...) in der MainClass nimmt als Argument ein IOperation Interface. Der Typ, der das Interface implementiert, ist der Methode egal, weil sie nichts von ihm braucht. Das einzige was die Methode braucht, sind die Methode Compute() und die Eigenschaft Name, und die bekommt sie durch das Interface.

Ein weiterer Vorteil von Interfaces ist auch, dass du - anders als bei Klassen - mehrere Interfaces in eine Klasse implementieren kannst und nicht nur eins. Also:
ausblenden C#-Quelltext
1:
2:
3:
public class Irgendwas : ICopy, IOperation, IClonable
{
}


Bei Klassen funktioniert sowas nicht:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public class IrgendwasBase 
{
}

public class IrgendwasBase2 
{
}

public class Irgendwas : IrgendwasBase, IrgendwasBase2
{
}

Das geht nicht. Wenn du die zwei Basisklassen als Interfaces deklarierst, geht es wieder.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler

Für diesen Beitrag haben gedankt: RalphHoffmann
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 09.06.15 14:57 
Zitat:
Ich muss also in jeder Klasse den alles neu Programmieren? Und da isse wieder, die Frage: WOZU? :-)


Weil es jede Klasse anders macht bzw. anders machen muß? Es wäre tatsächlich sinnfrei wenn du das gleiche mehrmals programmieren müßtest. Um in deinem Beispiel zu bleiben du hast ein Interface das ein Copy Methode bereithält (die ist zwar so wie von dir gezeigt zwar Unsinn da da nix rauskommt wo ist nach dem Aufruf also die Kopie hin aber egal). Stell dir vor du hast weitere Ableitungen von deiner Document Klasse (z.B. für einseitige, mehrseitige, farbige oder was auch immer für Eigenschaften die sich nicht als Eigenschaften der gleichen Document Klasse ausdrücken lassen). Interface machen erstmal tatsächlich wenig Sinn wenn nur eine Klasse das implementiert du brauchst weitere um den Sinn zu verstehen. Da jede Ableitung der Dokument Klasse intern anders aufgebaut ist und aus anderen Daten besteht muß auch die Implementierung der Copy Methode jedes mal anders ausprogrammiert werden. So und jetzt stell dir vor du hast die Aufgabe eine Liste von Dokumenten zu kopieren. Voila dir kann völlig egal sein das jedes Dokument eine andere Klasse ist mit einer zwangsweise anders implementierten Copy Methode du mußt nur Wissen das sie ICopy kann und du daher für alle einfach Copy aufrufen kannst um sie zu kopieren ohen zu Wissen was das für ein Dokument ist bzw. was das für eine Klasse ist.

Für diesen Beitrag haben gedankt: RalphHoffmann
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 09.06.15 15:49 
Hallo Ralph,

der Sinn von Schnittstellen (interfaces) wird erst bei größeren Projekten (mit einer sauberen Architektur) verständlich.
Es geht um die Austauschbarkeit von Funktionalität, d.h. man kann dann Klassen und Methoden entwickeln, welche für eine Vielzahl von Implementierungen genutzt werden können.

Wenn eine Methode jetzt die Signatur void Copy(ICopy document) (anstatt void Copy(Document document)) trägt, so kann diese Methode mit unterschiedlichsten Klassenobjekten aufgerufen werden.

Für diesen Beitrag haben gedankt: RalphHoffmann
RalphHoffmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Di 23.06.15 16:20 
Hallo an Alle :-)

Vielen Dank für eure ausführliche Hilfe.

Ich denke, jetzt hab' ich's......ich versuchs mal zu erklären, wie ich es meine verstanden zu haben. Also.... :-)

Interfaces werden dazu benutzt, Funktionen (selbst geschriebene oder von .Net zur Verfügung gestellte) unabhängig von der Typenangabe nutzen zu können. Somit entfällt, dass ich die benötigte Funktion für jeden Datentyp anpassen und damit x-mal schreiben muss. Dabei ist es dann egal, welcher Datentyp die, mit dem Interface zur Verfügung gestellte, Funktion aufruft.

Könnt ihr das so unterschreiben? *lach*

Beste Grüße
Ralph