Interfaces (Guía de programación de C#)Interfaces (C# Programming Guide)

Una interfaz contiene las definiciones de un grupo de funcionalidades relacionadas que una clase o una estructura pueden implementar.An interface contains definitions for a group of related functionalities that a class or a struct can implement.

Mediante las interfaces puede incluir, por ejemplo, un comportamiento de varios orígenes en una clase.By using interfaces, you can, for example, include behavior from multiple sources in a class. Esta capacidad es importante en C# porque el lenguaje no admite la herencia múltiple de clases.That capability is important in C# because the language doesn't support multiple inheritance of classes. Además, debe usar una interfaz si desea simular la herencia de estructuras, porque no pueden heredar de otra estructura o clase.In addition, you must use an interface if you want to simulate inheritance for structs, because they can't actually inherit from another struct or class.

Defina una interfaz mediante la palabra clave interface, como se muestra en el ejemplo siguiente.You define an interface by using the interface keyword, as the following example shows.

interface IEquatable<T>
{
    bool Equals(T obj);
}

Cualquier clase o estructura que implementa la interfaz IEquatable<T> debe contener una definición para un método Equals que coincida con la firma que la interfaz especifica.Any class or struct that implements the IEquatable<T> interface must contain a definition for an Equals method that matches the signature that the interface specifies. Como resultado, puede contar con una clase que implementa IEquatable<T> para contener un método Equals con el que una instancia de la clase puede determinar si es igual a otra instancia de la misma clase.As a result, you can count on a class that implements IEquatable<T> to contain an Equals method with which an instance of the class can determine whether it's equal to another instance of the same class.

La definición de IEquatable<T> no proporciona una implementación para Equals.The definition of IEquatable<T> doesn’t provide an implementation for Equals. La interfaz define solo la firma.The interface defines only the signature. De esa manera, una interfaz en C# es similar a una clase abstracta en la que todos los métodos son abstractos.In that way, an interface in C# is similar to an abstract class in which all the methods are abstract. Sin embargo, una clase o estructura puede implementar varias interfaces, pero una clase solo puede heredar una clase única, ya sea abstracta o no.However, a class or struct can implement multiple interfaces, but a class can inherit only a single class, abstract or not. Por tanto, mediante las interfaces, puede incluir un comportamiento de varios orígenes en una clase.Therefore, by using interfaces, you can include behavior from multiple sources in a class.

Para obtener más información sobre las clases abstractas, vea Clases y miembros de clase abstractos y sellados .For more information about abstract classes, see Abstract and Sealed Classes and Class Members.

Las interfaces pueden contener métodos, propiedades, eventos, indizadores o cualquier combinación de estos cuatro tipos de miembros.Interfaces can contain methods, properties, events, indexers, or any combination of those four member types. Para obtener vínculos a ejemplos, vea Secciones relacionadas.For links to examples, see Related Sections. Una interfaz no puede contener constantes, campos, operadores, constructores de instancias, finalizadores ni tipos.An interface can't contain constants, fields, operators, instance constructors, finalizers, or types. Los miembros de interfaz son públicos automáticamente y no pueden incluir modificadores de acceso.Interface members are automatically public, and they can't include any access modifiers. Los miembros tampoco pueden ser estáticos.Members also can't be static.

Para implementar un miembro de interfaz, el miembro correspondiente de la clase de implementación debe ser público, no estático y tener el mismo nombre y firma que el miembro de interfaz.To implement an interface member, the corresponding member of the implementing class must be public, non-static, and have the same name and signature as the interface member.

Cuando una clase o estructura implementa una interfaz, la clase o estructura debe proporcionar una implementación para todos los miembros que define la interfaz.When a class or struct implements an interface, the class or struct must provide an implementation for all of the members that the interface defines. La propia interfaz no proporciona ninguna funcionalidad que una clase o estructura puedan heredar de la misma la forma en que pueden heredar la funcionalidad de la clase base.The interface itself provides no functionality that a class or struct can inherit in the way that it can inherit base class functionality. Sin embargo, si una clase base implementa una interfaz, cualquier clase que se derive de la clase base hereda esta implementación.However, if a base class implements an interface, any class that's derived from the base class inherits that implementation.

En el ejemplo siguiente se muestra una implementación de la interfaz IEquatable<T>.The following example shows an implementation of the IEquatable<T> interface. La clase de implementación Car debe proporcionar una implementación del método Equals.The implementing class, Car, must provide an implementation of the Equals method.

public class Car : IEquatable<Car>
{
    public string Make {get; set;}
    public string Model { get; set; }
    public string Year { get; set; }

    // Implementation of IEquatable<T> interface
    public bool Equals(Car car)
    {
        if (this.Make == car.Make &&
            this.Model == car.Model &&
            this.Year == car.Year)
        {
            return true;
        }
        else
            return false;
    }
}

Las propiedades y los indizadores de una clase pueden definir descriptores de acceso adicionales para una propiedad o indizador que estén definidos en una interfaz.Properties and indexers of a class can define extra accessors for a property or indexer that's defined in an interface. Por ejemplo, una interfaz puede declarar una propiedad que tenga un descriptor de acceso get.For example, an interface might declare a property that has a get accessor. La clase que implementa la interfaz puede declarar la misma propiedad con un descriptor de acceso get y set.The class that implements the interface can declare the same property with both a get and set accessor. Sin embargo, si la propiedad o el indizador usan una implementación explícita, los descriptores de acceso deben coincidir.However, if the property or indexer uses explicit implementation, the accessors must match. Para obtener más información sobre la implementación explícita, vea Implementación de interfaz explícita y Propiedades de interfaces.For more information about explicit implementation, see Explicit Interface Implementation and Interface Properties.

Las interfaces pueden implementar otras interfaces.Interfaces can implement other interfaces. Una clase puede incluir una interfaz varias veces a través de las clases base que hereda o a través de las interfaces que otras interfaces implementan.A class might include an interface multiple times through base classes that it inherits or through interfaces that other interfaces implement. Sin embargo, la clase puede proporcionar una implementación de una interfaz solo una vez y solo si la clase declara la interfaz como parte de la definición de la clase (class ClassName : InterfaceName).However, the class can provide an implementation of an interface only one time and only if the class declares the interface as part of the definition of the class (class ClassName : InterfaceName). Si la interfaz se hereda porque se heredó una clase base que implementa la interfaz, la clase base proporciona la implementación de los miembros de la interfaz.If the interface is inherited because you inherited a base class that implements the interface, the base class provides the implementation of the members of the interface. Sin embargo, la clase derivada puede volver a implementar los miembros de interfaz, en lugar de usar la implementación heredada.However, the derived class can reimplement the interface members instead of using the inherited implementation.

Una clase base también puede implementar miembros de interfaz mediante el uso de los miembros virtuales.A base class can also implement interface members by using virtual members. En ese caso, una clase derivada puede cambiar el comportamiento de la interfaz reemplazando los miembros virtuales.In that case, a derived class can change the interface behavior by overriding the virtual members. Para obtener más información sobre los miembros virtuales, vea Polimorfismo.For more information about virtual members, see Polymorphism.

Resumen de interfacesInterfaces Summary

Una interfaz tiene las propiedades siguientes:An interface has the following properties:

  • Una interfaz es como una clase base abstracta.An interface is like an abstract base class. Cualquier clase o estructura que implementa la interfaz debe implementar todos sus miembros.Any class or struct that implements the interface must implement all its members.

  • No se puede crear una instancia de una interfaz directamente.An interface can't be instantiated directly. Sus miembros se implementan por medio de cualquier clase o estructura que implementa la interfaz.Its members are implemented by any class or struct that implements the interface.

  • Las interfaces pueden contener eventos, indizadores, métodos y propiedades.Interfaces can contain events, indexers, methods, and properties.

  • Las interfaces no contienen ninguna implementación de métodos.Interfaces contain no implementation of methods.

  • Una clase o estructura puede implementar varias interfaces.A class or struct can implement multiple interfaces. Una clase puede heredar una clase base y también implementar una o varias interfaces.A class can inherit a base class and also implement one or more interfaces.

En esta secciónIn This Section

Implementación de interfaz explícitaExplicit Interface Implementation
Explica cómo crear un miembro de clase que es específico de una interfaz.Explains how to create a class member that’s specific to an interface.

Cómo: Implementar explícitamente miembros de interfazHow to: Explicitly Implement Interface Members
Proporciona un ejemplo de cómo implementar explícitamente miembros de interfaces.Provides an example of how to explicitly implement members of interfaces.

Cómo: Implementar explícitamente miembros de dos interfacesHow to: Explicitly Implement Members of Two Interfaces
Proporciona un ejemplo de cómo implementar explícitamente miembros de interfaces con herencia.Provides an example of how to explicitly implement members of interfaces with inheritance.

Secciones relacionadasRelated Sections

Interfaces (Interfaces) en Learning C# 3.0: Master the Fundamentals of C# 3.0 (Aprendizaje de C# 3.0: Dominar los conceptos fundamentales de C# 3.0)Interfaces in Learning C# 3.0: Master the Fundamentals of C# 3.0

Vea tambiénSee Also

Guía de programación de C#C# Programming Guide
HerenciaInheritance