Was ist ein Interface und wozu wird es verwendet?

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von fichz.

    Was ist ein Interface und wozu wird es verwendet?

    Hallo Leute,

    Nach ein paar Jahren .NET Entwicklung stelle ich mir so langsam die Frage was ein Interface ist, da ich das bis dato nicht verwendet habe.
    Ich sehe es immer wieder in diversen Quellcodes, nur kann ich damit eben nichts anfangen.

    Ich habe mir jetzt schon zahlreiche Artikel darüber angesehen aber komme einfach nicht weiter.
    Was ich weiß ist dass man dadurch flexibler und sicherer entwickeln kann, nur verstehe ich nicht wie man ein Interface in der Praxis anwendet.

    Könnt ihr mir vielleicht dabei helfen?
    Ich bin am verzweifeln weil ich es einfach nicht peile :-s.

    Vielen Dank soweit und viele Grüße! :saint:

    MorphRa schrieb:

    ein Interface
    an einem einfachen Beispiel:
    Taschenrechner.
    Ein solches Interface beschreibt, dass mit einem oder zwei Input-Werten eine Operation durchgeführt werden kann.
    Die Implementierung sagt, ob da Plus, Minus, Mal, Durch, Atan2 (Operationen mit zwei Imput-Werten)
    oder
    Wurzel, unäres Minus, Sinus usw. (Operationen mit einem Imput-Wert) durchgeführt werden können.
    Was für Prozeduren müssen vom Interface bereitgestellt werden:
    Name,
    Wert bzw. Wert1, Wert2,
    Calculate.
    Vorteil:
    Das Interface kann veröffentlicht werden und Entwickler in Überallhausen können ihre Operation(en) implementieren, ohne auf den Core anderer Entwickler angewiesen zu sein.
    Wo überall die Implementationen (hier: DLLs) zusammengeführt werden, laufen sie problemlos miteinander.
    Kunden, die nur Addieren wollen, bekommen Plus und Minus, andere das, was sie halt brauchen.
    Wenn neue Funktionalitäten erforderlich sind, werden sie einfach hinzugefügt, ohne den Quelltext der Hauptanwendung anfassen zu müssen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dann bringe ich mal ein Beispiel angewandter Praxis:

    Im Bereich der Xamarin.Forms Entwicklung(mobil, plattformübergreifend) gibt es den sog. Dependency Service. Dieser tut für dich etwas sehr praktisches:

    Du definierst in deiner PCL(Portable Class Library, das Projekt mit dem Code der auf allen Plattformen gleich sein soll)z.B. folgendes Interface:
    C# Code

    C#-Quellcode

    1. public interface INativeFunktionen
    2. {
    3. void DoNativ1(string name);
    4. void DoNativ2(int nummer);
    5. string GetNativeValue();
    6. }

    VB:NET Code; ACHTUNG: Konverter

    VB.NET-Quellcode

    1. Public Interface INativeFunktionen
    2. Sub DoNativ1(name As String)
    3. Sub DoNativ2(nummer As Integer)
    4. Function GetNativeValue() As String
    5. End Interface


    Dieses muss auf einer Zielplattform natürlich Implementiert werden:
    Android
    C# Code

    C#-Quellcode

    1. namespace Projekt.Android
    2. {
    3. public class NativeFunktionen : INativeFunktionen
    4. {
    5. public void DoNativ1(string name)
    6. {
    7. //Nativer Hokus-pokus
    8. }
    9. public void DoNativ2(string name)
    10. {
    11. //Nativer Hokus-pokus
    12. }
    13. public string GetNativeValue()
    14. {
    15. //Nativer Hokus-pokus
    16. return someAndroidStringValue
    17. }
    18. }
    19. }

    VB:NET Code; ACHTUNG: Konverter

    VB.NET-Quellcode

    1. Namespace Projekt.Android
    2. Public Class NativeFunktionen
    3. Implements INativeFunktionen
    4. Public Sub DoNativ1(name As String)
    5. 'Nativer Hokus-pokus
    6. End Sub
    7. Public Sub DoNativ2(name As String)
    8. 'Nativer Hokus-pokus
    9. End Sub
    10. Public Function GetNativeValue() As String
    11. 'Nativer Hokus-pokus
    12. Return someAndroidStringValue
    13. End Function
    14. End Class
    15. End Namespace

    iOS
    C# Code

    C#-Quellcode

    1. namespace Projekt.iOS
    2. {
    3. public class NativeFunktionen : INativeFunktionen
    4. {
    5. public void DoNativ1(string name)
    6. {
    7. //Nativer Hokus-pokus
    8. }
    9. public void DoNativ2(string name)
    10. {
    11. //Nativer Hokus-pokus
    12. }
    13. public string GetNativeValue()
    14. {
    15. //Nativer Hokus-pokus
    16. return someiOSStringValue
    17. }
    18. }
    19. }

    VB:NET Code; ACHTUNG: Konverter

    VB.NET-Quellcode

    1. Namespace Projekt.iOS
    2. Public Class NativeFunktionen
    3. Implements INativeFunktionen
    4. Public Sub DoNativ1(name As String)
    5. 'Nativer Hokus-pokus
    6. End Sub
    7. Public Sub DoNativ2(name As String)
    8. 'Nativer Hokus-pokus
    9. End Sub
    10. Public Function GetNativeValue() As String
    11. 'Nativer Hokus-pokus
    12. Return someiOSStringValue
    13. End Function
    14. End Class
    15. End Namespace


    Was du damit erreichen willst, ist folgendes:
    Dein Hauptprojekt, in dem sich der Code befindet, den du zwischen allen Platformen teilen möchtest, kann nicht auf Native Funktionen zugreifen, da nicht bekannt ist, auf welcher Plattform der Code nun ausgeführt wird. Da du jedoch das Interface hast, kannst du mit diesem nun Programmieren. Das einzige was du nun Tun musst, ist folgendes, DependencyService.Get<INativeFunktionen>() aufzurufen, und hast dann die entsprechende Implementierung in deinem INativeFunktionen Objekt.

    Edit: Wie du siehst haben interfaces eine ganze Reihe an Verwendungsmöglichkeiten

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „EaranMaleasi“ ()

    Um's kurz zu sagen: Interfaces sind Verträge, die Dir Member, also Funktionen, Properties etc., definieren und Dir dann damit sagen, was Du implementieren musst.

    Dies ist sehr praktisch, um bspw. dem Benutzer eine eigene Implementierung von Funktionen zu ermöglichen. Du hast also diese Freiheit, aber es ist vorgeschrieben, dass Du ein gewisses Muster erfüllen musst und diese eine Funktion explizit implementieren musst. Dann kannst Du auch einfach über den Typ des Interfaces jegliche Klassen, die es implementieren, zuweisen und ansprechen.

    VB.NET-Quellcode

    1. Public Interface IAnimal
    2. Public Sub MakeNoise()
    3. End Interface
    4. Public Class Dog Implements IAnimal
    5. Public Sub MakeNoise()
    6. MessageBox.Show("Wau Wau")
    7. End Sub
    8. End Class
    9. Public Class Cat Implements IAnimal
    10. Public Sub MakeNoise()
    11. MessageBox.Show("Miau")
    12. End Sub
    13. End Class


    Du definierst also einen Vertrag, was alle Tiere haben müssen und sie implementieren das dann jeweils auf ihre Weise. Manche Tiere machen vielleicht auch nichts und dann bleibt die Methode halt leer. Aber der Vertrag muss erfüllt sein.

    Dann kannste einfach z. B. eine Variable erstellen und jegliche Klassen, die IAnimal implementieren, zuweisen und ansprechen.

    VB.NET-Quellcode

    1. Public Class Test
    2. Public Sub MakeNoise()
    3. Dim animal As IAnimal = New Cat()
    4. animal.MakeNoise() ' Miau
    5. Dim otherAnimal As IAnimal = New Dog()
    6. otherAnimal.MakeNoise() 'Wau Wau
    7. End Sub
    8. Public Sub MakeNoiseWithAnyAnimal(animal As IAnimal)
    9. animal.MakeNoise() ' Egal, was der Benutzer beim Aufrufen mitgibt, es hat diese Methode und Du kannst sie aufrufen.
    10. End Sub
    11. End Class


    Gibt dann natürlich noch die Möglichkeit Interfaces in Interfaces zu implementieren etc., aber das soll jetzt mal reichen. ;)

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Alles bisher erwähnte kann auch eine abstrakte Klasse die keine Implementation beinhaltet. (in VB MustInherit)

    Der (wohl größte) Vorteil an Interfaces in .NET ist, dass eine Klasse beliebig viele Interfaces implementieren kann, aber nur von einer erben.
    Im wörtliche Sinne ist ein Interface etwas, was man kann. Also Funktionalität die dich aber nicht in deiner Gänze beschreibt.
    Daher wäre ein Interface Animal in meinen Augen eigentlich eine abstrakte Klasse. Denn diese beschreibt, was man ist (Ein Tier) und ist im Normalfall auch sehr komplex und würde in der Realität vll sogar etwas implementieren.
    Ein Interface wäre eher IDressiert mit den Methoden apportieren und zeigeKunststück oder so. (ich weiss ist nicht das beste Beispiel aber die Idee dahinter sollte klar sein)
    Aus beiden kann man dann eine Klasse Hund erstellen die von Animal erbt und IDressiert implementiert.
    Das ist meine Signatur und sie wird wunderbar sein!
    Klar ist diskutabel, ob das Sinn macht, dafür ein Interface zu verwenden. Ich würde normal auch eher zu einer Basisklasse tendieren, ob abstrakt oder nicht, kann man dann von Fall zu Fall auch noch unterscheiden, aber zum Verständnis halt, was das Interface macht, ist mir nichts besseres eingefallen. ;)

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ja aber man kann sich für das Verständnis an der Realität orientieren.

    Ein Tier muss demnach eine abstrakte Klasse sein, weil es kein "nur" Tier in dem Sinne gibt. Maximal vll ein unbekanntes Tier, aber es gibt eigentlich nur konkrete Tierarten (und dort eigentlich noch entsprechende Rassen).

    Also Tier -> Wirbeltier -> Säugetier -> Raubtier -> Hund (-> Bulldogge)

    Wenn man es mal übertreiben will (und es ginge sogar noch übertriebener), könnten das alles abstrakte Klassen sein (bis auf Bulldogge) die von einander erben xD

    Und "Tier" ist ja auch wahrlich keine Funktionalität, daher halt eigentlich sehr unpassend als Beispiel für ein Interface. Und das gehört in meinen Augen auch zum Verständnis was ein Interface ist, vor allem im Vergleich zu abstrakten Klassen.
    Das ist meine Signatur und sie wird wunderbar sein!
    ja, aber beachte auch Monos Anmerkung dazu: Es gibt auch andere Mechanismen, um Polymorphie zu ermöglichen.

    Das ist nämlich, was ein Interface leistet: Es ermöglicht Polymorphie.
    Polimorphie bedeutet, dass verschiedene Klassen einheitlich behandelt werden können. Und das ist etwa gegeben bei verschiedenen Tier-Klassen, wenn sie ein gemeinsames Interface implementieren.

    Und ist ebenso gegeben in @Eanmaleasis Beispiel, wo sowohl das Adroid-Dingens als auch das iOS-Dingens auf dieselbe Weise ansprechbar sind (nämlich über das Interface, den "Vertrag")

    Wie gesagt - es gibt noch 2 weitere Techniken, um Polymorphie zu ermöglichen:
    1) abstrakte Methoden in gemeinsame Basisklassen
    2) Delegaten
    Hat alles Vor- und Nachteile

    (Edit: Hihi - Und beachte auch, dass Trades Code vollkommen vb.net-syntaxwidrig ist, das ist wohl komplett mit c# durcheinander-gegangen)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Gut zum Vergleich mit der Realität wäre auch folgendes:
    Man habe ein Auto. Und dieser beinhaltet einen Autoradio mit einer Freisprecheinrichtung. Das Radio bietet dafür eine Schnittstelle (engl. Interface) an damit man sich mit diesem verbinden kann. In vielen Fällen ist diese Schnittstelle "Bluetooth". Im Prinzip kann sich jedes Gerät welches das Interface Bluetooth implementiert und die in der Schnittstelle vorgegebenen Member korrekt ausprogrammiert mit dem Autoradio kommunizieren. Den Radio ist es egal ob das jetzt ein Handy ist mit iOS, Android oder eine Telefonzelle. Wenn es korrekt implementiert wurde können die beiden miteinander.

    Eventuell bietet der Radio auch eine Schnittstelle an um ein Telefonbuch anzuzeigen (im Autodisplay). Hier gibt es dann womöglich eine zweite Schnittstelle, welche auch implementiert werden kann (aber nicht muss). Dann kann das Radio eventuell nur als Freisprech benutzt werden, implemtiert das Endgerät aber auch die Telefonbuchschnittstelle dann kann es auch das Telefonbuch des Geräts anzeigen.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten