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