2017-02-28 5 views
1

ich habe auf msdn lesen, die:C# define Verfahren in der Schnittstelle

Schnittstellen keine Implementierung von Methoden enthalten.

Aber wenn ich den Code haben:

public interface ITest 
{ 
    void Print(string message); 
} 

public static void FullPrint(this ITest test, string message) 
{ 
    Console.WriteLine("-------------------"); 
    test.Print(message); 
    Console.WriteLine("-------------------"); 
} 

static void Main(string[] args) 
{ 
    ITest test = new CTest(); 
    test.FullPrint("test"); 
} 

public class CTest : ITest 
{ 
    public void Print(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

Ich habe eine Implementierung, die nur für diese Schnittstelle ist.

Also, in diesem Fall enthält meine Schnittstelle eine Methode oder nicht?

+4

Sie haben keine Umsetzung der dort Methode. Sie haben nur die Erklärung. – xanatos

+0

Ihr Code fehlt 'CTest', was der Schlüssel ist. –

+0

@HenkHolterman Ich habe den Code aktualisiert –

Antwort

1

Verfahren FullPrinteine Instanz eines Typs empfängt, die ITest implementiert.

Eine Schnittstelle, für dieses Beispiel die ITest, ist im Wesentlichen eine Vertragsdefinition. Es ist ein Versprechen, dass alle Typen, die diese Schnittstelle implementieren, die definierten Methoden und Eigenschaften dieser Schnittstelle enthalten. Aus diesem Grund haben Schnittstellen keine Implementierung, sie stellt ein Versprechen/einen Vertrag dar.

In Ihrem Beispiel wieder, machen Sie ein Versprechen/Vertrag, der jede Art, die ITest Methode enthält implementiert:

void Print(string message); 

Ihre Art (nicht gezeigt) CTest implementiert diese Schnittstelle. Anschließend erstellen Sie eine Referenz vom Typ ITest an die Instanz CTest.

+0

Ich habe auf msdn gelesen, dass in Expension-Methoden, ihr erster Parameter gibt an, welchen Typ die Methode bearbeitet. Das hat also nichts mit ihrer konkreten Umsetzung zu tun, oder? –

+0

@BudaGavril - seine ** Erweiterung ** Methoden (* keine Erweiterung *). Ja und Nein, wenn Sie den ersten Parameter als Schnittstelle definieren, dann ist das wahr, wenn Sie ihn als Klassentyp definieren und dieser Klassentyp vielleicht versiegelt ist, dann ja. – Igor

+0

@BudaGavril-Erweiterungsmethoden sind nicht auf Schnittstellen bezogen. Persönlich denke ich über sie wie eine schnelle Möglichkeit, Vererbung zu vermeiden, die in einigen Fällen ziemlich nützlich sein kann. – bradbury9

1

Sie haben erklärt ein Verfahren (seine Unterschrift zu geben), aber du hast es nicht eine Umsetzung geben. Schnittstellen können Implementierungen nicht enthalten, Basisklassen können dies.

In Ihrem Fall würde es bedeuten, Sie zu umschreiben:

public /*abstract */ class TestBase 
{ 
    public virtual void Print(string message) 
    { 
     // implementation 
    } 
} 
1

In Ihrem Fall haben Sie die Extension-Methode implementiert, die nur für Typen verwendet werden kann, die als ITest deklariert sind. ITest Interface enthält keine Methode FullPrint. Sie können Sie definieren Basisklasse andimplement Schnittstelle:

public class Test : ITest 
{ 
    public void Print(string message) 
    { 
    // implementation 
    } 
} 

Dann können Sie diese Methode auf folgende Weise verwenden:

ITest variable = new Test(); 
variable.FullPrint("Hello");