Was ist ein Interface und wofür/wie verwendet man es?

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Was ist ein Interface und wofür/wie verwendet man es?

    Ausgelagert aus NPOI erstellt excel falsch. ~Thunderbolt

    Thunderbolt schrieb:

    Aua. Man kann/sollte mit Interfaces arbeiten und nicht in irgendeine Klasse casten.

    Danke für den Hinweis :D. Hab mich schon gewundert warum im Excel Interope nur Interfaces da sind und keine "gscheiden" (vernünftigen) Klassen...Hab mit Interfaces noch relativ wenig Erfahrung, dachte immer die sind einmal dafür da um das Diamantenproblem bei Mehrfachvererbung zu beseitigen und haben außer den Methodendefinitonen keinen Methodenrumpf...wesewegen ich mich auch imer wieder wundere, warum ich in Code Snippet immer wieder Leute sehe, die mit Intefaces arbeiten wie mit Klassen :(
    Naja wurde eines besseren belehrt ;D

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    @Radinator Das ist ja auch richtig. Interfaces geben nur an, was erbende Klassen implementieren müssen. In einer Variable mit dem Datentyp eines Interfaces steht Nothing bzw. null oder eine Instanz einer Klasse, die dieses Interface implementiert.

    Beispiel:

    C#-Quellcode

    1. public interface IActivatable {
    2. void Activate();
    3. }
    4. public class ActivatableClass : IActivatable {
    5. public void Activate() {
    6. Console.WriteLine("Activated.");
    7. }
    8. }
    9. public class Program {
    10. public static void Main(string[] args) {
    11. IActivatable activatable = new ActivatableClass();
    12. activatable.Activate();
    13. Console.Read();
    14. }
    15. }
    Mit freundlichen Grüßen,
    Thunderbolt
    Ok danke für die Erklärung, aber was ist, wenn ich jetz mtw. eine Variable von was-weiß-ich IEnumerable mache, diese Interfaces implementieren doch bestimmt mehr als nur 1 Klasse, was für eine Wert hat dann die Variable?
    Bzw kannst du mir nen Link geben, in dem das vernünftig erklärt wird? Finde selber iwie nur MSDN-Zeug, die des noch unverständlicher erklären, als überhaupt nur möglich :(

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Radinator schrieb:

    was für eine Wert hat dann die Variable
    Das ist völlig irrelevant. Solange die Variable nicht null ist, kannst du damit alles machen, was das Interface deklariert. Das ist ja der Sinn von Interfaces: Sie schreiben nur vor, was da sein muss. Wie die Klasse das implementiert bleibt ihr überlassen.
    Mit freundlichen Grüßen,
    Thunderbolt
    Das hatten wir schon mal: Interfaces - Wozu sind sie gut und wie verwendet man sie?

    Da der Thread schon etwas älter ist, hier noch ein Nachtrag:
    Ich verwende Interfaces ganz gerne in diesem Fall:
    Ich habe eine relativ einfache Klasse (von den öffentlichen Membern her), die aber was recht kompliziertes macht. Ein Beispiel aus einem Hangman-Spiel (vereinfacht): Sie sendet und empfängt Pakete über das Netzwerk, die Interaktionen des Spiels darstellen.
    Es ist schwierig, Dinge zu testen, die diese Klasse verwenden, ohne permanent das "Gegenstück" laufen zu lassen, welches die gesendeten Pakete empfängt bzw. Pakete sendet, die von dieser Klasse empfangen werden.
    Deshalb wäre es praktisch, wenn man die Aufrufe an diese Klasse "abfangen" und anzeigen könnte, bzw. die Events per Knopfdruck mit bestimmten Daten auslösen könnte.
    Damit das möglichst einfach geht, habe ich die relevanten Member in ein Interface ausgelagert:

    VB.NET-Quellcode

    1. Public Interface IClient
    2. Event OfferGameReceived As EventHandler(Of OfferGameReceivedEventArgs)
    3. Event UpdateGameReceived As EventHandler(Of UpdateGameReceivedEventArgs)
    4. Event CloseGameReceived As EventHandler(Of CloseGameReceivedEventArgs)
    5. Sub RequestGames(ClientId As Guid)
    6. Sub TrySolveLetter(ClientId As Guid, GameId As Guid, Letter As Char)
    7. End Interface
    Also der Client kann nach verfügbaren Spielen suchen und versuchen, bei einem Spiel einen Buchstaben zu erraten.
    Ihm werden auch verfügbare Spiele mitgeteilt, er wird über Änderungen an Spielen informiert und ob das Spiel geschlossen wurde.
    Dann lass ich die ursprüngliche Klasse dieses Interface implementieren und tausche alle Verwendungen von der ursprünglichen Klasse mit dem Interface aus.
    Jetzt lassen sich die Klassen ganz einfach austauschen:

    VB.NET-Quellcode

    1. Private WithEvents Client As IClient
    2. '...
    3. 'Für "Produktiven" Einsatz:
    4. Client = New RealClient
    5. 'Für Tests:
    6. Client = New TestClient
    Also man muss nur eine Zeile ändern, um zwischen Tests und realem Einsatz umzuschalten.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()