Las interfaces definen las propiedades, los métodos y los eventos que pueden implementar las clases. Las interfaces permiten definir características como grupos pequeños de propiedades, métodos y eventos estrechamente relacionados; esto reduce los problemas de compatibilidad porque se pueden desarrollar implementaciones mejoradas para las interfaces sin comprometer el código existente. En cualquier momento se pueden agregar nuevas características mediante el desarrollo de implementaciones e interfaces adicionales.
Hay otras razones por las que se podrían usar las interfaces en vez de la herencia de clases:
- Las interfaces se adaptan mejor a situaciones en las que las aplicaciones necesitan que muchos tipos de objetos posiblemente no relacionados proporcionen una funcionalidad determinada.
- Las interfaces son más flexibles que las clases base porque puede definir una única implementación que puede implementar interfaces múltiples.
- Las interfaces son mejores en situaciones en las que no es necesario heredar una implementación de una clase base.
- Las interfaces son útiles cuando no se puede usar la herencia de clases. Por ejemplo, las estructuras no pueden heredar de clases, pero pueden implementar interfaces.
Declarar interfaces
Las definiciones de interfaz se encuentran dentro de las instrucciones Interface y End Interface. Después de la instrucción Interface, puede agregar una instrucción Inherits opcional que muestra una o varias interfaces heredadas. Las instrucciones Inherits deben preceder a todas las demás instrucciones de la declaración a excepción de los comentarios. El resto de instrucciones de la definición de interfaz deben ser instruccionesEvent, Sub, Function, Property, Interface, Class, Structure y Enum. Las interfaces no pueden contener código de implementación ni instrucciones asociadas al código de implementación, como End Sub o End Property.
En un espacio de nombres, las instrucciones de interfaz son Friend de forma predeterminada, pero también se pueden declarar explícitamente como Public o Friend. Las interfaces definidas dentro de clases, módulos, interfaces y estructuras son Public de forma predeterminada, pero también se pueden declarar explícitamente como Public, Friend, Protected o Private.
Por ejemplo, el código siguiente define una interfaz con una función, una propiedad y un evento.
Interface IAsset Event ComittedChange(ByVal Success As Boolean) Property Division() As String Function GetID() As Integer End Interface
Implementar interfaces
La palabra reservada de Visual Basic Implements se usa de dos maneras. La instrucción Implements significa que una clase o estructura implementa una interfaz. La palabra clave Implements significa que un miembro de clase o de estructura implementa un miembro de interfaz específico.
Implements (Instrucción)
Si una clase o estructura implementa una o más interfaces, debe incluir la instrucción Implements inmediatamente después de la instrucciónClass o Structure. La instrucción Implements requiere una lista separada por comas de las interfaces que implementará una clase. La clase o estructura debe implementar todos los miembros de interfaz mediante la palabra clave Implements.
Implements (palabra clave)
La palabra clave Implements requiere una lista separada por comas de los miembros de interfaz que se implementarán. Por lo general solo se especifica un miembro de interfaz, pero pueden especificarse varios. La especificación de un miembro de interfaz consta del nombre de la interfaz —que debe especificarse en una instrucción implements dentro de la clase—, un punto y el nombre de la función miembro, propiedad o evento que se va a implementar. El nombre de un miembro que implementa un miembro de interfaz puede usar cualquier identificador permitido y no se limita a la convención InterfaceName_MethodName que se usaba en versiones anteriores de Visual Basic.
Por ejemplo, el código siguiente muestra cómo declarar una subrutina denominada Sub1 que implementa un método de una interfaz:
Class Class1 Implements interfaceclass.interface2 Sub Sub1(ByVal i As Integer) Implements interfaceclass.interface2.Sub1 End Sub End Class
Los tipos de parámetro y los tipos devueltos del miembro implementador deben coincidir con la declaración de miembro o de propiedad de interfaz de la interfaz. La manera más habitual de implementar un elemento de una interfaz es mediante un miembro que tenga el mismo nombre que la interfaz, tal como se muestra en el ejemplo anterior.
Para declarar la implementación de un método de interfaz, puede usar cualquier atributo permitido en las declaraciones de método de instancia, incluidos Overloads, Overrides, Overridable, Public, Private, Protected, Friend, Protected Friend, MustOverride, Default y Static. El atributo Shared no está permitido, ya que define una clase en lugar de un método de instancia.
Con Implements también se puede escribir un único método que implemente varios métodos definidos en una interfaz, como en el ejemplo siguiente:
Class Class2 Implements I1, I2 Protected Sub M1() Implements I1.M1, I1.M2, I2.M3, I2.M4 End Sub End Class
Se puede usar un miembro privado para implementar un miembro de interfaz. Cuando un miembro privado implementa un miembro de una interfaz, ese miembro pasa a estar disponible por medio de la interfaz incluso si no está disponible directamente en las variables de objeto de la clase.
Ejemplos de implementación de interfaces
Las clases que implementan una interfaz deben implementar todas sus propiedades, métodos y eventos.
En el ejemplo siguiente se definen dos interfaces. La segunda interfaz, Interface 2, hereda Interface 1 y define un método y una propiedad adicionales.
Interface Interface1 Sub sub1(ByVal i As Integer) End Interface ' Demonstrates interface inheritance. Interface Interface2 Inherits Interface1 Sub M1(ByVal y As Integer) ReadOnly Property Num() As Integer End Interface
En el ejemplo siguiente se implementa Interface 1, la interfaz definida en el ejemplo anterior:
Public Class ImplementationClass1 Implements Interface1 Sub Sub1(ByVal i As Integer) Implements Interface1.sub1 ' Insert code here to implement this method. End Sub End Class
En el ejemplo final se implementa Interface 2, incluido un método heredado de Interface 1:
Public Class ImplementationClass2 Implements Interface2 Dim INum As Integer = 0 Sub sub1(ByVal i As Integer) Implements Interface2.sub1 ' Insert code here that implements this method. End Sub Sub M1(ByVal x As Integer) Implements Interface2.M1 ' Insert code here to implement this method. End Sub ReadOnly Property Num() As Integer Implements Interface2.Num Get Num = INum End Get End Property End Class
Puede implementar una propiedad de solo lectura con una propiedad de lectura y escritura (es decir, no tiene que declararla de solo lectura en la clase implementadora). Al implementar una interfaz, se implementarán al menos los miembros que declara la interfaz, pero se puede ofrecer más funcionalidad como, por ejemplo, permitir que se pueda escribir en la propiedad.
No hay comentarios:
Publicar un comentario