C# Cómo hacer referencia a la implementación de la interfaz predeterminada en una clase implementadora.
Considere la siguiente interfaz, con una implementación predeterminada de TestMethod
lang-c#
public interface TestInterface
{
public int TestMethod()
{
return 15;
}
}
Llamar a TestMethod
en la siguiente clase causará una excepción StackOverflowException:
lang-c#
public class TestClass : TestInterface
{
public int TestMethod()
{
return 1 + (this como TestInterface).TestMethod();
}
}
Ahora entiendo por qué sucede esto, pero ¿hay alguna manera de solucionarlo? ¿Algo como base.TestMethod()
para hacer referencia a una de las interfaces implementadas por la clase?
Sé que podría cambiar el nombre del método en TestInterface y hacer referencia a él de esa manera en TestClass, pero eso causaría problemas para otras clases que no necesitan hacer referencia a la implementación predeterminada.
davy.ai
Como experto en IT especializado en C#, interfaces e implementación por defecto, entiendo el problema que se plantea al llamar al
TestMethod
en laTestClass
. Esta llamada causará un bucle infinito de llamadas recursivas entreTestMethod
en laTestClass
y la implementación por defecto deTestMethod
en laTestInterface
, resultando en una StackOverflowException.Para solucionar este problema, una forma es utilizar la implementación explícita de interfaces. Esto significa implementar el método de la interfaz de forma explícita en la clase, sin exponerlo como un miembro público de la clase. La sintaxis para implementar explícitamente un método de interfaz es la siguiente:
“`lang-c#
public class TestClass : TestInterface
{
int TestInterface.TestMethod()
{
return 1 + (this as TestInterface).TestMethod();
}
}
De esta manera, la
TestClass
tiene una propiedad privadatestInterface
que es una instancia de una clase anidada privadaTestInterfaceImpl
que implementa laTestInterface
. LaTestClass
puede llamar alTestMethod
de laTestInterface
a través de la propiedadtestInterface
, sin necesidad de herencia o implementación por defecto.Ambos enfoques tienen sus ventajas y desventajas, y la elección depende de los requisitos específicos y el diseño de la aplicación. Sin embargo, ambos proporcionan formas de solucionar el problema de las llamadas recursivas a la implementación de interfaz predeterminada y evitar la StackOverflowException.