在C#8.0之前,接口仅包含成员的声明(方法,属性,事件和索引器),但是从C#8.0开始,允许将成员及其实现添加到接口中。现在,您可以在不破坏接口的现有实现的情况下向其接口添加方法,这种类型的方法称为默认接口方法(也称为虚拟扩展方法) 。此功能允许程序员使用特质编程技术(特质是面向对象的编程技术,它允许在不相关的类之间重用方法)。
重要事项:
- 允许您在界面中实现索引器,属性或事件访问器。
- 允许您在界面中使用访问修饰符,例如私有,受保护,内部,公共,虚拟,抽象,覆盖,密封,静态,带有默认方法,属性等的外部修饰符。并且在使用修饰词关键字时要小心。
- 您可以在界面中创建静态字段,方法,属性,索引器和事件。
- 您可以覆盖修饰符。
- 具有默认访问权限的显式访问修饰符是公共的。
- 如果接口包含默认方法并由某些指定的类继承,则该类对该接口的默认方法的存在一无所知,也不包含默认方法的实现。
- 如果覆盖默认方法,则无需使用任何修饰符。如示例2所示。
- 允许您使用默认方法中的参数。如示例3所示。
- 允许您在界面中使用相同的名称方法,但是它们必须具有不同的参数列表。如示例3所示。
- 您可以扩展默认方法。
现在,在给定示例的帮助下讨论此概念。在此示例中,我们有一个名为I_interface的接口,其中包含两个方法,即display_1和display_2 。在这里, display_1()方法仅在I_interface中声明,并且不包含其定义,而display_2()方法同时包含声明和其定义,这种类型的方法称为默认接口方法。
范例1:
// C# program to illustrate the concept
// of the default interface method
using System;
// A simple interface
interface I_interface {
// This method is only
// have its declaration
// not its definition
void display_1();
// Default method with both
// declaration and definition
public void display_2()
{
Console.WriteLine("Hello!! Default Method");
}
}
// A class that implements
// the I_interface interface.
class Example_Class : I_interface {
// Providing the body
// part of the method
public void display_1()
{
Console.WriteLine("Hello!! Method");
}
// Main Method
public static void Main(String[] args)
{
// Creating an object
Example_Class t = new Example_Class();
// Calling method
t.display_1();
// Creating an object
I_interface obj = t;
// Calling default method
obj.display_2();
}
}
输出:
Hello!! Method
Hello!! Default Method
现在,我们借助I_interface接口调用display_2()方法。如果尝试使用类对象调用此方法
// Calling default method
// With the help of Example_Class object
t.display_2();
那么编译器将给出错误,如下所示:
Error CS1061: ‘Example_Class’ does not contain a definition for ‘display_2’ and no accessible extension method ‘display_2’ accepting a first argument of type ‘Example_Class’ could be found (are you missing a using directive or an assembly reference?)
范例2:
// C# program to illustrate how to override
// the default interface method
using System;
// A simple interface
interface I_interface {
// This method having
// only declaration
// not its definition
void display_1();
// Default method has both
// declaration and definition
public void display_2()
{
Console.WriteLine("Hello!! Default Method of I_interface");
}
}
// Interface which inherits I_interface
interface A_interface : I_interface {
// Here, we override the display_2() method
// Here you are not allowed to use any access modifier
// if you use, then the compiler will give an error
void I_interface.display_2()
{
Console.WriteLine("Hello!! Overriden default method");
}
}
// A class that implements both interfaces.
class Example_Class : I_interface, A_interface {
// Providing the body part of the method
public void display_1()
{
Console.WriteLine("Hello!! Method of I_interface");
}
// Main Method
public static void Main(String[] args)
{
// Creating object
Example_Class t = new Example_Class();
// Calling method
t.display_1();
// Creating an object
I_interface obj1 = t;
// Calling default method
obj1.display_2();
// Creating an object
A_interface obj2 = t;
obj2.display_2();
}
}
输出:
Hello!! Method of I_interface
Hello!! Overriden default method
Hello!! Overriden default method
范例3:
// C# program to illustrate how
// to pass parameters in the
// default interface method
using System;
// A simple interface
interface I_interface {
// This method only
// have declaration
// not its definition
void display_1();
// Default method with both
// declaration and definition
// Here, the name of both methods are same
// but the parameter list is different
public void display_1(int a, int b)
{
int sum;
sum = a + b;
Console.WriteLine("Sum: " + sum);
}
}
// A class which
// implement I_interface interface
class Example_Class : I_interface {
// Providing the body
// part of the method
public void display_1()
{
Console.WriteLine("Hello!! Method of I_interface");
}
// Main Method
public static void Main(String[] args)
{
// Creating an object
Example_Class t = new Example_Class();
// Calling method
t.display_1();
// Creating an object
I_interface obj = t;
// Calling and passing parameters in the default method
obj.display_1(1, 4);
}
}
输出:
Hello!! Method of I_interface
Sum: 5