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 :

Imbrication Hiérarchie Interfaces


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut Imbrication Hiérarchie Interfaces
    Salut à toutes et à tous,

    Je cherche à créer une classe "Vecteur" qui devra entrer dans un ObservableCollection<Vecteur>.

    Il s'agit de l'ensemble des vecteurs formant un polygone.
    Mon problème est qu'un vecteur peut être soit une ligne, soit un arc, soit une polyligne.
    J'ai cherché à me documenter mais je n'y arrive pas. J'ai besoin de votre aide pour m'éclairer.

    Un vecteur a toujours un ID, une LongueurRéelle et une LongueurForcée

    Si c'est une droite:
    elle a un Point1 et un Point2
    sa longueur est la distance entre les 2 points (Formule 1)
    Si c'est un arc:
    elle a un Point1, un Point2 et un PointCentresa longueur est la distance entre les 2 points (Formule 2)
    Si c'est une polyligne:
    elle a un ObservableCollection<Point>
    sa longueur est la somme des distances entre les points (Formule 3)

    Je n'ai aucun pbl au niveau des formules ou des classes Droite, Arc et Polyligne, mais là où je coince c'est comment arriver à obtenir un Vecteur utilisable pour un ObservableCollection, donc qui a une signature identique dans les 3 cas ?

    J'ai bien pensé à créer un vecteur qui contiendrait ID, LongueurRéelle, LongueurForcée et un Objet qui contiendrait Ligne, Arc ou Polyligne.
    Je suis pourtant convaincu que ce n'est pas la meilleure méthode.
    À ce que j'ai vu, les interfaces pourraient m'aider, mais je n'arrive pas à comprendre comment.

    Les interfaces sont-elle vraiment la solution que je cherche ? Si oui, comment devrais-je faire ? Sinon, quelle serait la méthode que je devrais utiliser ?

    Merci de vos z'avis z'avisés,
    JM
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    les interfaces permettent à peu près la même chose que l'héritage
    la solution ici serait à mon avis de mettre le traitement des tes données dans les classes

    exemple si c'est pour dessiner ces vecteurs, il faudrait que la méthode de dessin soit sur chaque classe

    mais du coup que ca soit avec interface ou héritage tu peux y arriver

    avec héritage il faudrait mettre une méthode virtual qui dessine, et donc tu peux faire 3 classes filles qui auront chacune leurs propriétés et le code de dessin
    avec une collection de la classe de base tu pourrais appeler la méthode virtual qui fera donc des choses différentes selon le type de l'instance

    avec les interfaces il te faudrait une interface IVecteur qui aurait une méthode de dessin, et l'interface serait implémenter dans chaque classe


    principales différences entre héritage et interfaces :
    - par héritage une classe parente peut avoir du code, une interface n'a pas de code, l'héritage permet donc d'avoir du code générique qui n'est pas copié collé
    - le multi héritage est impossible en .net, par contre la multi implémentation est possible, ce qui permet d'avoir plusieurs interfaces et que chaque code qui fait une fonctionnalité a juste à tester si l'instance implémente telle interface pour savoir que telle méthode peut etre appelée sur l'instance
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Merci de tes explications Pol63.
    Ça me permet quand-même de comprendre certaines choses. Entre autre que l'interface ne m'aidera pas dans la recherche de la solution à mon problème.

    Toutefois mon pbl n'est pas au niveau du traitement des données individuellement.
    Mon problème est plutôt qu'un polygone contient des vecteurs, et que ces vecteurs ne sont pas tjrs du même type. Il s'agit plus d'un pbl de "stockage" des entités différentes.

    À ce que j'ai compris, ma méthode n'était peut-être si mauvaise que je le pensais.
    La classe Vecteur pourrait contenir la LongueurForcée, un objet (qui selon le cas serait une ligne, un arc ou une polyligne), et une LongueurRéelle (qui irait soit récupérer la longueur dans l'objet, ou qui la calculerait selon le type d'objet).

    A moins qu'une meilleure solution me soit proposée, auquel cas je suis toujours intéressé.

    JM
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Jean-Marc68 Voir le message
    Mon problème est plutôt qu'un polygone contient des vecteurs, et que ces vecteurs ne sont pas tjrs du même type. Il s'agit plus d'un pbl de "stockage" des entités différentes.
    le stockage reste le plus simple
    par exemple une classe vide VecteurBase, 3 classes héritées avec les propriétés du type de vecteur
    et sur la classe polygon une propriété de type VecteurBase, comme ca tu peux mettre n'importe quelle instance d'un type dérivé dedans
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 243
    Points : 328
    Points
    328
    Par défaut
    Bonjour,

    Il est possible que je ne sois pas bien réveillé mais j'ai l'impression que tu as donné la solution dans ton énoncé :
    1 classe Vecteur abstraite avec 3 propriétés : ID, LongueurReelle et LongueurForcee.
    3 classes qui en héritent (et qui implémentent bien sûr les propriétés/méthodes de Vecteur) :
    • Droite avec les propriétés Point1 et Point2 supplémentaires (de type Point)
    • Arc avec les propriétés Point1, Point2 et PointCentres supplémentaires (de type Point)
    • Polyligne avec la propriété Points de type ObservableCollection<Point>


    Ensuite, tu stocke tes vecteurs dans une propriété Vecteurs de type ObservableCollection<Vecteur> de ta classe Polygone.

    J'ai raté quelque chose?

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Merci à tous les 2,

    Un mix de vos réponses m'a fait comprendre.

    En effet, 250rgv, la réponse était dans la question, à condition de créer une classe Vecteur vide, comme le suggère Pol63.

    Je devais avoir le nez trop collé sur le problème. Je n'ai jamais pensé créer la classe vide, et mon problème était justement que les données étaient différentes selon les objets, et je ne voyais pas comment les traiter. Je créais des paramètres qui étaient toujours masqués, ce que je trouvais bizarre. Mais en effet, il suffisait de ne pas les créer dans la classe Vecteur.
    Enfin, le fait d'avoir la classe vecteur, même vide, me permet de limiter les objets qui pourraient être mis dans un ObservableCollection qui contiendra les vecteurs du polygone.

    Merci de m'avoir aidé, même si vous n'en avez pas eu l'impression.

    JM
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 243
    Points : 328
    Points
    328
    Par défaut
    ben désolé (ne le prends pas mal) mais c'est idiot de faire une classe Vecteur sans aucune propriété (ni méthodes). Tu passes complètement à coté des avantages de l'héritage.

    A mon sens, si tu ne veut rien mettre dans Vecteur, et bien, c'est que tu n'en as pas besoin : Tu ne fais hériter tes trois classes (Droite/Arc/Polyligne) de rien (si ce n'est d'Object implicitement) et une ObservableCollection<Object> te suffit largement pour les y stocker.

    Une classe Vecteur vide te permettra de limiter ta collection aux seuls instances de type Vecteur mais c'est tout : a chaque fois que tu voudra accéder à une des propriétés ID, LongueurReelle ou LongueurForcee, tu devra effectuer un cast de ces instance dans le bon type.
    Si, au contraire, ces propriétés sont définies dans la classe Vecteur (c'est leur 'place' car elles sont communes - et de même type - aux différents types de vecteur, ce qui change, c'est l’implémentation de certaines, par exemple la méthode utilisée pour calculer la longueur), tant que tu ne travailles que sur ces propriétés, et bien tu te moque du type réel de l'instance que tu utilise : tu travaille sur un vecteur et tu n'as pas besoin d'aller chercher plus loin. Tu sais que quand tu lit la propriété Longueur, une longueur calculée selon la méthode spécifique au type réel de l'instance te sera retournée sans que toi tu n'ai besoin de le tester/connaître ce type réel.

    Donc au lieu d'avoir un code du type (désolé, pour le pseudo code, j'en ai pas écrit depuis longtemps et mon c# est rouillé aussi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Long l = 0;
    Vecteur V = MaCollection[x]
    si (V comme Droite) <> null
    alors ! =  (V comme Droite).Longueur
    sinon si (V comme Arc) <> null
            alors ! =  (V comme Arc).Longueur
            sinon si (V comme PolyLigne) <> null
                    alors ! =  (V comme PolyLigne).Longueur
                    sinon...
                                    /* même principe pour chaque type de vecteur */
                    fin si             
            fin si
    fin si
    tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Vecteur V = MaCollection[x]
    Long l = V.Longueur;
     
    ou plus concis :D
    Long l = MaCollection[x].Longueur;
    Moi je préfère le 2nd et toi ?
    Sans compter que si demain, tu as besoin d'ajouter un autre type de vecteur, et bien le 2nd code continuera à fonctionner sans modifications alors que ce ne sera pas le cas du 1er.


    Enfin, je t'invite à regarder des tutos/cours sur l'héritage (quelque soit le langage) et ensuite plus précisément l'héritage en c#.

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Merci de tes explications 250rgv.

    Je m'en suis rendu compte .

    J'ai donc laissé dans Vecteur l'ID, les 2 pts extrémités et les 2 longueurs, ce qui me permet de récupérer ces valeurs sans devoir caster l'élément.

    Merci pour le conseil sur les cours. Je les avais lu, mais en codant que je comprend mieux certains points qui restaient nébuleux pour moi, comme par exemple ceci.

    Maintenant je me retrouve avec un autre type de pbl, mais comme c'est un autre type de pbl, je fais des recherches, et si je ne trouve pas, j'ouvrirai un nouveau post.

    Encore merci de ton aide.
    JM
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 243
    Points : 328
    Points
    328
    Par défaut
    bon courage

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

Discussions similaires

  1. [EJB Stateless] Hiérarchie d'interfaces et de classes
    Par bdusauso dans le forum Java EE
    Réponses: 2
    Dernier message: 31/05/2010, 11h32
  2. [VB6] [Interface] ComboBox à plusieurs colonnes
    Par mtl dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/03/2004, 17h35
  3. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15
  4. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27
  5. [VB6] [Interface] Icones de boutons de barre d'outils
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 13/09/2002, 15h50

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