接口c#中的具体方法
c#
据我所知,我无法在 c# 的接口中创建具体方法,它应该给我一个错误,但是当我这样做时
interface IPerson
{
void x();
public void y()
{
Console.WriteLine("Welcome From Interface");
}
}
class Teacher : IPerson
{
public void x()
{
}
}
并且在主要
static void Main(string[] args)
{
IPerson p = new Teacher();
p.y();
Console.ReadKey();
}
输出变成 => Welcome From Interface 为什么它没有给我一个错误?
回答
此功能是 C# 8 中的新增功能,在接口中称为默认实现。
基本上,您可以在接口内提供一个方法的实现,该接口由实现它的类“继承”。
请注意,默认实现只能访问接口中的其他成员,除了接口具有属性之外,您不能声明状态。一个典型的用例是当您提供重载时,这些重载最终都链接到一个公共重载中,也许是具有最多参数的重载。
这使得实现接口更容易,但也可以在接口中加入更多成员,而不必重新编译提供实现它们的类型的程序集,也不必将这些方法添加到这些类型中。
注意实现接口的类仍然可以实现成员。然后,您将拥有该实现。请注意,这不是继承,因此您不能base.y()从类中实现的方法调用,以调用接口中的默认实现。使用默认实现,除非您在类中提供实际实现,否则该实现将完全替换接口中的默认实现。
另一个细节是这些方法仅在您拥有接口类型的变量而不是具体类型的变量时才可用。
所以虽然这有效:
IPerson p = new Person();
p.y();
这不会:
var p = new Person(); // p is now of type Person
p.y(); // CS1061 'Type' does not contain a definition for 'y' and no accessible extension method 'y' could be found
由于您的问题中已经有一个非常好的简短示例,因此除非您要求澄清其他一些细节,否则我不会在此处添加更多代码。