📜  C#8.0中的默认接口方法

📅  最后修改于: 2021-05-30 00:28:30             🧑  作者: Mango

在C#8.0之前,接口仅包含成员的声明(方法,属性,事件和索引器),但是从C#8.0开始,允许将成员及其实现添加到接口中。现在,您可以在不破坏接口的现有实现的情况下向其接口添加方法,这种类型的方法称为默认接口方法(也称为虚拟扩展方法) 。此功能允许程序员使用特质编程技术(特质是面向对象的编程技术,它允许在不相关的类之间重用方法)。

重要事项:

  • 允许您在界面中实现索引器,属性或事件访问器。
  • 允许您在界面中使用访问修饰符,例如私有,受保护,内部,公共,虚拟,抽象,覆盖,密封,静态,带有默认方法,属性等的外部修饰符。并且在使用修饰词关键字时要小心。
  • 您可以在界面中创建静态字段,方法,属性,索引器和事件。
  • 您可以覆盖修饰符。
  • 具有默认访问权限的显式访问修饰符是公共的。
  • 如果接口包含默认方法并由某些指定的类继承,则该类对该接口的默认方法的存在一无所知,也不包含默认方法的实现。
  • 如果覆盖默认方法,则无需使用任何修饰符。如示例2所示。
  • 允许您使用默认方法中的参数。如示例3所示。
  • 允许您在界面中使用相同的名称方法,但是它们必须具有不同的参数列表。如示例3所示。
  • 您可以扩展默认方法。

现在,在给定示例的帮助下讨论此概念。在此示例中,我们有一个名为I_interface的接口,其中包含两个方法,即display_1display_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();

那么编译器将给出错误,如下所示:

范例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