1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juillet 2017
    Messages : 6
    Points : 9
    Points
    9

    Par défaut Interface ou classe abstraite, meilleur pratique ?

    Bonjour à tous, je me permet de poster ici car je suis débutant et aurait une question quant à la meilleur pratique à adopter pour ce type de comportement.
    Je possède deux classes Error et Information (que je n'ai pas implémenté, mais plus ou moins le même code que Error).
    Ces deux classes possèdent des propriétés ainsi que des méthodes communes, mais aussi d'autres spécifiques. Plus tard dans le code les objets qui leur correspondent seront ajoutés à une liste contenant le type de base de ces deux classes.
    Je voudrais donc savoir si la meilleure solution pour leur faire partager cela était de les faire hériter d'une interface, ou bien plutôt d'une classe abstraite (ou autre ?) ? Merci d'avance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public interface Interaction
    {
        int Code { get; set; }
        string Message { get; set; }
        /* many others properties */
        void DoSomething();
    }
     
    public class Error : Interaction
    {
        public int Code { get; set; }
        public string Message { get; set; }
        public Error() { /* initialize properties */ }
        public void DoSomething(){ /* implementation */ }
    }
    ou bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public abstract class Interaction
    {
        int Code { get; set; }
        string Message { get; set; }
        public Interaction(int Code, string Message) { /* initialize properties */ }
        /* many others properties */
        public abstract void DoSomething();
    }
     
    public class Error : Interaction
    {
        public Error(int Code, string Message) : base(Code, Message) {  }
        public override void DoSomething(){ /* implementation */ }
    }

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Inscrit en
    juillet 2007
    Messages
    12 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 12 319
    Points : 27 141
    Points
    27 141

    Par défaut

    SAlut;

    il y a un item à ce sujet chez MS :
    https://msdn.microsoft.com/fr-fr/lib...(v=vs.71).aspx (en anglais uniquement)
    If you anticipate creating multiple versions of your component, create an abstract class. Abstract classes provide a simple and easy way to version your components. By updating the base class, all inheriting classes are automatically updated with the change. Interfaces, on the other hand, cannot be changed once created. If a new version of an interface is required, you must create a whole new interface.

    If the functionality you are creating will be useful across a wide range of disparate objects, use an interface. Abstract classes should be used primarily for objects that are closely related, whereas interfaces are best suited for providing common functionality to unrelated classes.

    If you are designing small, concise bits of functionality, use interfaces. If you are designing large functional units, use an abstract class.

    If you want to provide common, implemented functionality among all implementations of your component, use an abstract class. Abstract classes allow you to partially implement your class, whereas interfaces contain no implementation for any members.
    ce qu'on peut synthétiser en

    Si plusieurs versions de votre composant=>classe abstraite.

    Si les fonctionnalités seront utiles dans une large gamme d'objets disparates, =>interface.

    Si éléments de fonctionnalité petits et concis => interface. Si grandes unités fonctionnelles, =>classe abstraite.

    Si fonctionnalités communes et mises en œuvre parmi toutes les implémentations de votre composant, => classe abstraite.
    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juillet 2017
    Messages : 6
    Points : 9
    Points
    9

    Par défaut

    Merci beaucoup Jean-phillipe André, votre réponse fut concise et m'a beaucoup informé.
    Je n'avais pas vu cette documentation, mais en la suivant je pense donc me tourner vers la classe abstraite pour adapter mon problème.
    En effet ce sont de grandes parties des classes qui sont partagées et non juste des petites fonctionnalités.

  4. #4
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 416
    Points : 4 774
    Points
    4 774
    Billets dans le blog
    5

    Par défaut

    Bonjour,

    A avoir aussi à l'esprit les aspects suivants :
    • Une classe ne peut hériter que d'une seule classe ;
    • Une classe peut implémenter autant d'interface que nécessaire.


    Ensuite, une classe abstraite peut définir et implémenter des méthodes, alors qu'une interface ne peut que les définir.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/05/2010, 11h46
  2. différence entre interface et classe abstraite
    Par yacin87 dans le forum Débuter
    Réponses: 3
    Dernier message: 29/03/2010, 12h36
  3. Interface ou classe abstraite ?
    Par cobolfingaz dans le forum C#
    Réponses: 6
    Dernier message: 15/07/2008, 18h21
  4. [POO] Différence entre Interface et classe Abstraite
    Par viviboss dans le forum Syntaxe
    Réponses: 7
    Dernier message: 29/11/2006, 17h39
  5. Interface ou classe abstraite ?
    Par Premium dans le forum Langage
    Réponses: 8
    Dernier message: 21/02/2006, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo