C# Interface implementieren und auf Methoden zugreifen

estre

Commander
Registriert
Dez. 2005
Beiträge
3.006
Hey,

Ich bräuchte etwas Hilfe zur Implementierung eines Interfaces.

Und zwar möchte ich auf Methoden zugreifen die ein bestimmtes Interface bereitstellt.
Es handelt sich um folgendes Interface:
http://msdn.microsoft.com/en-us/library/windows/desktop/ee309562(v=vs.85).aspx

Nun ist es ja so, dass man das Interface am Klassennamen implementieren kann (siehe Bild).
Wie kann ich jetzt auf die Methoden des Interfaces zugreifen, muss ich nicht vorher ein Objekt erzeugen?

Danke für Eure Hilfe!

Grüße
 

Anhänge

  • interface.PNG
    interface.PNG
    12,8 KB · Aufrufe: 1.319
Hi,

ein Interface stellt keine Methoden bereit! Jede Klasse, die dieses Interface implementieren möchte muss die im Interface festgelegten Methoden bereitsstellen, sorum stimmt es!

Oder wie MS es formuliert:

Eine Schnittstelle enthält nur die Signaturen von Methoden, Delegaten oder Ereignissen. Die Implementierung der Methoden erfolgt wie im folgenden Beispiel in der Klasse, die die Schnittstelle implementiert

Quelle

Du hast das scheinbar mit Vererbung verwechselt. Wenn du eine Klasse von einer anderen ableitest kannst du z.B. direkt auf die Methoden der Elternklasse zugreifen - das hat hiermit nichts zu tun!

VG,
Mad
 
Hi,

ich bin mir nicht sicher ob Du verstanden hast was ein Interface ist.
Das Interface selbst hat keine Funktionen sonder gibt nur die Vorlage, wie die Funktionen auszusehen haben.
Implementieren musst Du sie selbst.

Edit:Ich denke Madman hat recht und Du verwechselst da was mit Vererbung.
 
Hallo,

wenn du ein Interface implementierst, stehen dir keine Methoden zur Verfügung. Dir stehen nur die Methodensignaturen bzw. der Methodenkopf zur Verfügung. Implementieren musst du diese Methoden eigenständig.

Bewege mal die Maus über die Interface-Klasse, dann sollte Visual Studio dir anbieten, die Methoden in der Program-Klasse zu implementieren. Die darauffolgende Verarbeitung musst du nun ausprogrammieren.

Grüße,
Daniel
 
p64y schrieb:
Hallo,

wenn du ein Interface implementierst, stehen dir keine Methoden zur Verfügung. Dir stehen nur die Methodensignaturen bzw. der Methodenkopf zur Verfügung. Implementieren musst du diese Methoden eigenständig.


Hey,

zunächst mal danke für Eure Beiträge, dann habe ich das wohl elementar falsch verstanden.

D.h. zu diesem Interface muss es jetzt auch noch irgendwelche Klassen geben, die es implementieren können?!
Wenn ich z.B. ein Objekt dieser Klasse erzeuge kann ich mit diesem Objekt dann auf die Methoden des Interfaces zugreifen?
 
Hi,

du greifst NIE auf Methoden von Interfaces zu, schlicht weil diese keine Methoden haben! Die haben nur Mehtodensignaturen! Es geht nur darum: Man hat mehrere Klassen. Um sicherzustellen, dass alle Klassen eine bestimmte Methode implementiert haben einigt man sich, welche Signatur die Methode aufweist (Name, Parameter etc) und schreibt diese in ein Interface. Jede Klasse, die dieses Interface implementiert sagt dadurch aus "Alles klar, ich schwöre, dass ich diese Methode mit den Parametern so implementiert habe". Mehr ist das nicht!

Hoffe es ist versändlicher :)

VG,
Mad
 
estre schrieb:
Wenn ich z.B. ein Objekt dieser Klasse erzeuge kann ich mit diesem Objekt dann auf die Methoden des Interfaces zugreifen?
Theoretisch ja, da diese Klasse laut MSDN das genannte Interface implementiert.

Grundsätzlich muss du aber aufpassen, da das alles COM-Interop, also unmanaged Code, ist. D. h. manche Sachen funktionieren deutlich anders als unter "reinem" .NET. Deshalb immer die Doku genau lesen.
 
Aber er kann zumindest folgendes machen, was er wissen sollte:

Meine Interface heißt Auto und implementiert die Methode Gasgeben.

Meine Klassen heißen Ford und BMW


Code:
List<Auto> autos = new List<Auto>();

Auto auto1 = new BMW();
Auto auto2 = new Ford();

autos.Add(auto1);
autos.Add(auto2);

foreach (Auto auto in autos)
      auto.gasgeben();
 
Hi,

@Magic1416

Nochmal: Interfaces implementieren KEINE METHODEN! Das müssen die Klassen machen, die das Interface implementieren wolllen!

VG,
Mad
 
estre schrieb:
D.h. zu diesem Interface muss es jetzt auch noch irgendwelche Klassen geben, die es implementieren können?!

Nein, sobald du ein Interface implementierst, bis du derjenige der die Klasse erstellt die das Interface implementiert.

Erstellt dir mal eine neue Klasse (bitte nicht die statische Program-Klasse benutzen) und implementiere das Interface IMessageFilter

Code:
    private class MeineKLasse : IMessageFilter
    { 
    
    }

Wenn du dort mit der rechten Maustaste auf IMessageFilter klickst, und dann Schnittstelle implementieren -> Schnittstelle implementieren anklickst wird Code erzeugt der die Definitionen die im IMessageFilter-Interface definiert sind in deine Klasse implementiert.

Code:
 private class MeineKLasse : IMessageFilter
    {

        public bool PreFilterMessage(ref Message m)
        {
            throw new NotImplementedException();
        }
    }

Deine Klasse ist dann kompatibel zu IMessageFilter.

Wenn jetzt eine Funktion in einem Programm ein Objekt deiner Klasse erstellt kann sie mittels Umwandlung die im Interface definierten und in deiner Klasse implementierten Funktionen aufrufen.

Code:
    private class MeineKlasse : IMessageFilter
    {
        public bool PreFilterMessage(ref Message m)
        {
            throw new NotImplementedException();
        }
    }

    private class MeineZweiteKlasse
    {
        private void MeineFunktion()
        {
            MeineKlasse MeineKlasseObjekt = new MeineKlasse();
            IMessageFilter IMessageFilterAnsicht = (IMessageFilter)MeineKlasseObjekt;
            // Hier kann man nun über IMessageFilterAnsicht die Funktionen der definierten Schnittstelle IMessageFilter aufrufen, deren spezifische Implementation sich in der Klasse MeineKlasse befindet.
        }
    }

Wenn du in MeineKlasse jetzt noch zusätzliche öffentliche Funktionen oder Eigenschaften definieren würdest, würdest du die über das Objekt MeineKlasseObjekt sehen, aber nicht über die IMessageFilterAnsicht.
Ein Interface ist also eine klassenübergreifende Vereinbarung über einen Funktionsumfang.
Jede Klasse die das Interface IMessageFilter implementiert MUSS die Funktion "public bool PreFilterMessage(ref Message m)" anbieten. Was die macht ist wurscht. Es ist nur wichtig dass sie da ist.
 
@Madman1209
hab mich auf die schnelle falsch ausgedrückt. Das Beispiel funktioniert aber trotzdem. Ich finde den Vorteil von Interfaces lässt sich am besten in einem Array erkennen.

Ein weiteres sinniges Beispiel ist die Verwendung von unterschiedlichen Datenbankverbindungen wie ODBC, JET oder SQL. Dafür gibt es im Framework jeweils verschiedene Klassen und jeweils den dazugehörigen Interfaces.
Programmiert man mit den Interfaces kann man ohne Probleme das Datenbank Backend ändern, ohne den Code für das Programm anpassen zu müssen.
 
Zurück
Oben