c#:在接口中定义方法

c#:在接口中定义方法,c#,interface,C#,Interface,我读过: 接口不包含方法的实现 但如果我有密码: public interface ITest { void Print(string message); } public static void FullPrint(this ITest test, string message) { Console.WriteLine("-------------------"); test.Print(message); Console.WriteLine("-------

我读过:

接口不包含方法的实现

但如果我有密码:

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);
    }
}
我有一个仅用于此接口的实现

那么,在本例中,我的接口是否包含方法?

您已经声明了一个方法(给出了它的签名),但没有给它一个实现。接口不能容纳实现,基类可以

在您的情况下,这意味着您必须重写为:

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

方法
FullPrint
接收实现
ITest
的某种类型的实例

在本例中,名为
ITest
的接口本质上是合同定义。它承诺实现该接口的任何类型都将包含该接口的已定义方法和属性。这就是为什么接口没有实现,它代表承诺/契约

在您的示例中,您再次承诺/约定任何实现
ITest
的类型都将包含方法:

void Print(string message);

您的类型(未显示)
CTest
实现该接口。然后,您将创建一个类型为
ITest
的引用,引用到
CTest

的实例。在本例中,您实现的扩展方法只能用于声明为ITest的类型。ITest接口不包含方法FullPrint。 您可以定义基类和实现接口:

public class Test : ITest
{
    public void Print(string message)
    {
    // implementation
    }
}
然后,您可以按以下方式使用该方法:

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

您在那里没有该方法的实现。您只有声明。您的代码缺少键
CTest
。@HenkHolterman我已经更新了我在msdn上读到的代码,在expension方法中,它们的第一个参数指定了该方法操作的类型。所以这与它们的具体实现无关,对吗?@BudaGavril-它的扩展方法(不是扩展)。是和否,如果将第一个参数定义为接口,则为真;如果将其定义为类类型,且该类类型可能已密封,则为是。@BudaGavril扩展方法与接口无关。就我个人而言,我认为它们是一种避免使用继承的快速方法,在某些情况下,继承非常有用。