Site:  Cours VB.net  
5.4 Les interfaces.

Définition: Interface et implémentation:

Ce que je vois de l'objet, c'est son interface (le nom des propriétés, le nom des méthodes..) exemple: le nom de la méthode Clear fait partie de l'interface d'une ListBox. Par contre le code qui effectue la méthode (celui qui efface physiquement toutes les lignes de la listeBox), ce code se nomme implémentation, lui n'est ni visible ni accessible (Quand on est du coté du développeur qui utilise l'objet).

Un objet a donc une interface et une implémentation.

Quand maintenant on est du coté du créateur d'objet, dans un module de classe, si  on a crée un objet et ses membres, sans le savoir, on  crée en même temps l'interface et l'implémentation.

Mais il est possible de dissocier les 2.

Quel intérêt d'utiliser les interfaces?

Vous pouvez développer des implémentations avancées pour vos interfaces sans endommager le code existant, ce qui limite les problèmes de compatibilité. Vous pouvez également ajouter de nouvelles fonctionnalités à tout moment en développant des interfaces et implémentations supplémentaires.

Différences entre Classe et Interface:

Tout comme les classes, les interfaces définissent un ensemble de propriétés, méthodes et événements. Cependant, contrairement aux classes, les interfaces n'assurent pas l'implémentation. Elles sont implémentées par les classes et définies en tant qu'entités distinctes des classes.

Les interfaces  ne peuvent pas être modifiées après publication. En effet, toute modification apportée à une interface publiée risque d'endommager le code existant. Il faut partir du principe qu'une interface est une sorte de contrat.(La partie qui publie une interface accepte de ne jamais modifier cette dernière et l'implémenteur accepte de l'implémenter exactement comme elle a été conçue.)

Comme d'habitude:

Il y a

-les interfaces présentes dans les classes du Framework  (IList, ICollection...)

-les interfaces que vous créez de toutes pièces pour créer des objets.

Visual Basic .NET vous permet de définir des interfaces à l'aide de l'instruction Interface et de les implémenter avec le mot clé Implements.

 

Les interfaces présentes dans les classes du Framework.

Pour 'uniformiser' le comportement des objets, les interfaces sont largement utilisées dans VB.

Prenons l'exemple des collections:

Plutôt que de rendre communs à toutes les collections une méthode( Clear par exemple), VB donne la même interface à plusieurs types de Collections, ce qui uniformise la totalité des membres.

Les collections reposent sur l'interface ICollection, IList ou IDictionary. Les interfaces IList et IDictionary sont toutes les deux dérivées de l'interface ICollection.

Le nom des interfaces commence toujours par 'I'.

Dans les collections fondées sur l'interface IList ou directement sur l'interface ICollection (telles que Array, ArrayList, Queue ou Stack), chaque élément contient une valeur unique. Dans les collections reposant sur l'interface IDictionary (telles que Hashtable ou SortedList), chaque élément contient à la fois une clé et une valeur.

Détaillons l'interface Ilist:

L'interface Ilist permet de présenter une collection d'objets accessibles séparément par index.

Les méthodes de l'interface IList sont répertoriées ici.

Méthodes publiques

Add Ajoute un élément.
Clear Supprime tous les éléments.
Contains Détermine si la liste contient une valeur spécifique.
IndexOf Détermine l'index d'un élément spécifique.
Insert Insère un élément dans la liste à la position spécifiée.
Remove Supprime la première occurrence d'un objet spécifique.
RemoveAt Supprime l'élément correspondant à l'index spécifié.

Propriétés publiques

IsFixedSide Obtient une valeur indiquant si IList est de taille fixe.
IsReadOnly Obtient une valeur indiquant si IList est en lecture seule.
Item Obtient ou définit l'élément correspondant à l'index spécifié.

Les tableaux (Array) utilisent l'interface Ilist, mais aussi les collections (ArrayList) , des contrôles utilisent aussi cette interface (les ListBox, ComboBox), mais aussi les DataView...

Les ListBox possédent donc l'interface Ilist , on s'en doutait car on utilisait les méthodes Clear, Insert, Item...

Il y a plein d'autres interfaces.

Autre exemple: IEnumerable.

La Classe System.Array ( et d'autres ) implémente l'interface IEnumerable, ce qui permet d'utiliser une boucle For Each pour parcourir tous les éléments de l'Array.

(Voir 8-5 pour plus de détail)

Les interfaces crées par le programmeur:

De même que vous savez créer des classes, il est possible de créer de toutes pièces des interfaces.

Pour créer une Interface

  1. Dans un nouveau Module, définissez votre Interface en commençant par le mot clé Interface et le nom de l'interface et se terminant par l'instruction End Interface. Par exemple, le code suivant définit une Interface appelée Cryptage :
    Interface Cryptage
    End Interface
  2. Ajoutez des instructions définissant les propriétés, méthodes et événements pris en charge par votre Interface. Par exemple, le code suivant définit deux méthodes, une propriété et un événement :
    Interface Cryptage
       Function Encrypt(ByVal estring As String) As String
       Function Decrypt(ByVal dstring As String) As String
       Property CledeCodage() As Integer
       Event FinDecoding(ByVal RetVal As Integer)
    End Interface
    L'interface est créée.

Pour implémenter une Interface

  1. Si l'interface que vous implémentez ne fait pas partie de votre projet, ajoutez une référence à l'assembly qui contient l'interface.
  2. Créez une nouvelle classe qui implémente votre Interface et ajoutez le mot clé Implements dans la ligne à la suite du nom de la classe. Par exemple, pour implémenter l'interface Cryptage , vous pouvez nommer la classe d'implémentation MonEncrypte, comme dans le code suivant :
    Class MonEncrypte
       Implements Cryptage
    End Class
  3. Ajoutez des procédures pour implémenter les propriétés, méthodes et événements de la classe :
    Class MonEncrypte
       Implements Cryptage
       Event FinDecoding(ByVal RetVal As Integer) Implements Cryptage.FinDecoding
    
       Function Encrypt(ByVal estring As String) As String Implements Cryptage.Encrypt
          ' Placer le code de cryptage ici.
       End Function
       Function Decrypt(ByVal dstring As String) As String Implements Cryptage.Decrypt
          ' Placer le code de décryptage ici.
       End Function
            
       Property CledeCodage() As Integer Implements Cryptage.CledeCodage
          Get
             'Placer ici le code qui retourne la valeur de la propriété.
          End Get
          Set
             'Placer ici le code qui donne une valeur à la propriété.
          End Set
       End Property
    End Class

Noter que :

Pour chaque membre implémenté dans ce code, une instruction Implements indique le nom de l'interface et du membre implémenté.

Tous les membres de l'interface doivent être implémentés.

 

Enfin utiliser la classe MonEncrypte dans votre programme.

Dim C As New MonEncrypte()

C.CledeCodage=3

Dim ChaineEncryptée As String= C.Encrypt( "ChaineAEncrypter")

ou

Il faut créer une instance de la classe qui implémente MonEncrypte, crée une variable du type de l'interface, qui associe un gestionnaire d'événements à l'événement déclenché par l'instance, qui définit une propriété et exécute une méthode via l'interface.

Dim C As New MonEncrypte() 'Classe

Dim I As Cryptage()'Variable d'interface (ne pas mettre de 'New'

I=C

I.CledeCodage=3

Dim ChaineEncryptée As String = I.Encrypt( "ChaineAEncrypter")

Les 2 versions marchent.

    S'il y a un RaiseEvent dans une procédure qui déclenche un évènement de la classe il faut aussi ajouter une ligne AddHandler.


Il peut y avoir héritage de plusieurs interfaces:


Interface IComboBox
   Inherits ITextBox, IListBox
End Interface

Public Class EditBox
   Inherits Control
   Implements ITextBox
   Implements IListBox
   Public Sub Paint()Implements ITextBox.Paint
      ...
   End Sub
   Public Sub Bind(b As string) Implements IListBox.Clear
   End Sub
End Class