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扩展方法与接口无关。就我个人而言,我认为它们是一种避免使用继承的快速方法,在某些情况下,继承非常有用。