Métodos de interfaz predeterminados en C# 8.0

Antes de C# 8.0 , las interfaces solo contenían la declaración de los miembros (métodos, propiedades, eventos e indexadores), pero desde C# 8.0 se permite agregar miembros, así como su implementación a la interfaz. Ahora puede agregar un método con su implementación a la interfaz sin romper la implementación existente de la interfaz, este tipo de métodos se conocen como métodos de interfaz predeterminados (también conocidos como métodos de extensión virtual) . Esta función permite a los programadores utilizar la técnica de programación de rasgos (los rasgos son una técnica de programación orientada a objetos que permite la reutilización de los métodos entre clases no relacionadas).

Puntos importantes:

  • Puede implementar un indexador, una propiedad o un acceso a eventos en la interfaz.
  • Puede usar modificadores de acceso como privado, protegido, interno, público, virtual, abstracto, anulado, sellado, estático, externo con métodos predeterminados, propiedades, etc. en la interfaz. Y tenga cuidado al usar palabras clave modificadoras.
  • Puede crear campos estáticos, métodos, propiedades, indexadores y eventos en la interfaz.
  • Puede anular los modificadores.
  • Los modificadores de acceso explícitos con acceso predeterminado son públicos.
  • Si una interfaz contiene un método predeterminado y es heredado por alguna clase específica, entonces la clase no sabe nada sobre la existencia de los métodos predeterminados de esa interfaz y tampoco contiene la implementación del método predeterminado.
  • Si anula un método predeterminado, no es necesario utilizar ningún modificador. Como se muestra en el ejemplo 2.
  • Se le permite utilizar parámetros en el método predeterminado. Como se muestra en el ejemplo 3.
  • Puede usar métodos con el mismo nombre en la interfaz, pero deben tener listas de parámetros diferentes. Como se muestra en el ejemplo 3.
  • Se le permite ampliar el método predeterminado.

Ahora discuta este concepto con la ayuda del ejemplo dado. En este ejemplo, tenemos una interfaz llamada I_interface que contiene dos métodos, es decir, display_1 y display_2 . Aquí, el método display_1() solo se declara en I_interface y no contiene su definición, mientras que el método display_2() contiene tanto la declaración como su definición, este tipo de método se conoce como métodos de interfaz predeterminados.

Ejemplo 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();
    }
}

Producción:

Hello!! Method
Hello!! Default Method

Ahora llamamos al método display_2() con la ayuda de la interfaz I_interface . Si intenta llamar a este método con el objeto de clase

// Calling default method
// With the help of Example_Class object
t.display_2();

entonces el compilador dará un error como se muestra a continuación:

Error CS1061: ‘Example_Class’ no contiene una definición para ‘display_2’ y no se pudo encontrar ningún método de extensión accesible ‘display_2’ que acepte un primer argumento de tipo ‘Example_Class’ (¿falta una directiva de uso o una referencia de ensamblado?)

Ejemplo 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();
    }
}

Producción:

Hello!! Method of I_interface
Hello!! Overriden default method
Hello!! Overriden default method

Ejemplo 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);
    }
}

Producción:

Hello!! Method of I_interface
Sum: 5

Publicación traducida automáticamente

Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *