interface (Referencia de C#)
Una interfaz define un contrato. Cualquier class o struct que implemente ese contrato debe proporcionar una implementación de los miembros definidos en la interfaz. A partir de C# 8.0, una interfaz puede definir una implementación predeterminada de miembros. También puede definir miembros static para proporcionar una única implementación de funcionalidad común.
En el ejemplo siguiente, la clase ImplementationClass debe implementar un método denominado SampleMethod que no tiene ningún parámetro y devuelve void.
Para obtener más información y ejemplos, vea Interfaces.
Interfaz de ejemplo
interface ISampleInterface
{
void SampleMethod();
}
class ImplementationClass : ISampleInterface
{
// Explicit interface member implementation:
void ISampleInterface.SampleMethod()
{
// Method implementation.
}
static void Main()
{
// Declare an interface instance.
ISampleInterface obj = new ImplementationClass();
// Call the member.
obj.SampleMethod();
}
}
Una interfaz puede ser un miembro de un espacio de nombres o una clase. Una declaración de interfaz puede contener declaraciones (firmas sin ninguna implementación) de los miembros siguientes:
Normalmente, estas declaraciones de miembros anteriores no contienen ningún cuerpo. A partir de C# 8.0, un miembro de interfaz puede declarar un cuerpo. Esto se conoce como implementación predeterminada. Los miembros con cuerpos permiten que la interfaz proporcione una implementación "predeterminada" de las clases y las estructuras que no proporcionan una implementación de invalidación. Además, a partir de C# 8.0, una interfaz puede incluir:
- Constantes
- Operadores
- Constructor estático.
- Tipos anidados
- Campos, métodos, propiedades, indizadores y eventos estáticos.
- Declaraciones de miembros con la sintaxis de implementación de interfaz explícita.
- Modificadores de acceso explícitos (el acceso predeterminado es
public).
Es posible que las interfaces no contengan estado de instancia. Aunque los campos estáticos ahora están permitidos, los campos de instancia no se permiten en las interfaces. Las propiedades automáticas de instancia no se admiten en las interfaces, ya que declararían de forma implícita un campo oculto. Esta regla tiene un efecto sutil en las declaraciones de propiedad. En una declaración de interfaz, el código siguiente no declara una propiedad implementada automáticamente como hace en una class o un struct. En su lugar, declara una propiedad que no tiene una implementación predeterminada pero que se debe implementar en cualquier tipo que implemente la interfaz:
public interface INamed
{
public string Name {get; set;}
}
Una interfaz puede heredar de una o varias interfaces base. Cuando una interfaz invalida un método implementado en una interfaz base, debe usar la sintaxis de implementación de interfaz explícita.
Cuando una lista de tipos base contiene una clase e interfaces base, la clase base debe aparecer primero en la lista.
Una clase que implementa una interfaz puede implementar explícitamente miembros de esa interfaz. A un miembro implementado explícitamente solo se puede tener acceso mediante una instancia de la interfaz, y no mediante una instancia de la clase. Además, solo se puede acceder a los miembros de interfaz predeterminados a través de una instancia de la interfaz.
Para obtener más información sobre la implementación de interfaz explícita, vea Implementación de interfaz explícita.
Implementación de interfaz de ejemplo
En el ejemplo siguiente se muestra la implementación de una interfaz. En este ejemplo, la interfaz contiene la declaración de propiedad y la clase contiene la implementación. Cualquier instancia de una clase que implemente IPoint tiene las propiedades de entero x e y.
interface IPoint
{
// Property signatures:
int X
{
get;
set;
}
int Y
{
get;
set;
}
double Distance
{
get;
}
}
class Point : IPoint
{
// Constructor:
public Point(int x, int y)
{
X = x;
Y = y;
}
// Property implementation:
public int X { get; set; }
public int Y { get; set; }
// Property implementation
public double Distance =>
Math.Sqrt(X * X + Y * Y);
}
class MainClass
{
static void PrintPoint(IPoint p)
{
Console.WriteLine("x={0}, y={1}", p.X, p.Y);
}
static void Main()
{
IPoint p = new Point(2, 3);
Console.Write("My Point: ");
PrintPoint(p);
}
}
// Output: My Point: x=2, y=3
Especificación del lenguaje C#
Para obtener más información, vea la sección Interfaces de Especificación del lenguaje C# y la especificación de características de Miembros de interfaz predeterminados (C# 8.0)