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, héritage, polymorphisme


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut Interface, héritage, polymorphisme
    Bonjour à tous,

    J'ai un problème de conception et j'aimerai être sûr de faire juste...
    J'ai un objet "Task" avec deux méthodes "run" et "stop".
    J'ai un ojet dérivé de "Task" qui est "TaskTest".
    J'ai une interface "ITask" avec la méthode "run"

    Ce que je veux:
    - Rendre obligatoire la présence de la méthode "run" dans les classes dérivées, d'ou ITask
    - La méthode run et stop dans la classe base exécute un code commun à toutes les classes dérivées
    - utiliser le polymorphisme pour executer la méthode run de chaque classe dérivée

    Mais impossible de rendre obligatoire l'écriture de la méthode "run" dans les classes dérivées.

    Comment dois-je m'y prendre ? Voici le code que je tente de mettre en place ...

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /// <summary>
        /// Interface de gestion des tâches
        /// </summary>
        public interface IGTMTask
        {
            /// <summary>
            /// Méthode permettant d'exécuter la tâche
            /// </summary>
            void run();
        }
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    /// <summary>
        /// Objet représentant une tâche 
        /// </summary>
        public class Task 
        {        
            /// <summary>
            /// Date de début d'extraction
            /// </summary>
            private DateTime dtStart;
     
            /// <summary>
            /// Date de fin d'extraction
            /// </summary>
            private DateTime dtEnd;
     
            /// <summary>
            /// Indicateur de temps permettant de connaitre le teps d'exécution d'une tâche
            /// </summary>
            private Stopwatch sw;        
     
            #endregion
     
            #region Constructeurs
     
            /// <summary>
            /// Constructeur par défaut
            /// </summary>        
            public GTMTask()
            {
                this.sw = new Stopwatch();            
            }
     
            #endregion
     
            #region méthodes publiques
     
            /// <summary>
            /// Démarrage du chrono 
            /// </summary>
            public virtual void run()
            {
                try
                {
                    sw.Start();
                }
                catch (Exception) { }
            }
     
            /// <summary>
            /// Arrêt du chrono
            /// </summary>
            public void stop()
            {
                try
                {
                    sw.Stop();
                }
                catch (Exception) { }
            }
     
            #endregion
        }
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
     /// <summary>
        /// Tâche permettant de tester 
        /// </summary>
        public class TaskDerived : Task, ITask
        {
            #region Méthodes publiques
     
            /// <summary>
            /// Méthode principale
            /// </summary>
            public override void run()
            {
                try
                {
                    base.run(); // -- Appel de la méthode de base
     
                    for (int iSec = 5; iSec <= 100; iSec++)                                    
                        System.Threading.Thread.Sleep(1000);                
                }
                catch (Exception ex)
                {                
                }
                finally
                {                        
                }
            }
     
            #endregion
        }

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    si tu veux du code de base dans run, et rendre obligatoire la dérivation de cette méthode en gardant le code de base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public abstract class TaskBase
    {
     
        public abstract void Run();
     
        public void RunBase() // cette méthode est de l'interface
        {
            // code
            this.Run();
        }
     
    }
    en séparant en deux méthodes, ca permet d'éviter de forcer le développeur d'écrire l'appel à base.Run, qu'il pourrait oublier


    au passage réfléchis si l'interface est bien utile ... la classe de base peut peut-être suffire ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Super merci !! Et tu as raison, j'ai plus besoin de mon interface, la classe abstraite suffit.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    le run qui est abstract tu dois pouvoir le mettre en protected du coup, pour ne laisser apparaitre que celui ayant le code de base à l'intellisense
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Tout à fait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [débutant] héritage, polymorphisme, etc !
    Par remsrock dans le forum C#
    Réponses: 4
    Dernier message: 31/10/2008, 12h33
  2. Problème d'héritage - polymorphisme
    Par antoine2405 dans le forum Langage
    Réponses: 16
    Dernier message: 28/04/2008, 13h51
  3. Réponses: 6
    Dernier message: 08/02/2008, 14h58
  4. [Héritage] [Polymorphisme] Question de débutant ?
    Par TSnarfK dans le forum Langage
    Réponses: 9
    Dernier message: 12/09/2006, 15h39

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