IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Interface ou classe abstraite, meilleur pratique ?


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2017
    Messages : 7
    Points : 11
    Points
    11
    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
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    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.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    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
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2017
    Messages : 7
    Points : 11
    Points
    11
    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
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    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, 10h46
  2. différence entre interface et classe abstraite
    Par yacin87 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 29/03/2010, 11h36
  3. Interface ou classe abstraite ?
    Par cobolfingaz dans le forum C#
    Réponses: 6
    Dernier message: 15/07/2008, 17h21
  4. [POO] Différence entre Interface et classe Abstraite
    Par viviboss dans le forum Langage
    Réponses: 7
    Dernier message: 29/11/2006, 16h39
  5. Interface ou classe abstraite ?
    Par Premium dans le forum Langage
    Réponses: 8
    Dernier message: 21/02/2006, 10h23

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