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 :

Implémenter un truc proprement, sans héritage multiple


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 43
    Points : 53
    Points
    53
    Par défaut Implémenter un truc proprement, sans héritage multiple
    Salutations,

    Je suis confronté à un petit problème avec une situation qui me semble taillée pour de l'héritage multiple, sauf qu'évidemment la chose n'est pas permise en C#. Aussi je me demandais si quelqu'un aurait une idée pour contourner la chose aussi proprement que possible. Détail du problème :

    Je travaille actuellement sur un moteur de jeu de scrolling 3d isometrique permettant d'afficher des mondes comparables à ce qu'on peut voir sur Roller Coaster Tycoon : un terrain composé de différentes Tiles donc.

    A l'heure actuelle, le moteur graphique est bien avancé et je commence à me poser des questions concernant le code réseau : je souhaite développer un jeu pouvant se jouer à plusieurs selon une architecture client serveur classique.

    Histoire de faire les choses proprement, l'idéal serait que le programme serveur n'ait pas à se soucier des composantes graphiques du jeu, et même qu'il ignore jusqu'à l'existence de XNA.

    Pour ce faire, je souhaite donc partage ma classe Tile initiale en deux classes : Tile (nouvelle) utilisée à la fois par le client et le serveur, qui contient les informations logiques de la tile en question : sa hauteur, son type, les trucs relatifs aux collisions etc... et TileSprite, qui contient tout ce qui est relatif à l'affichage (apparence de la tile (Sprite), offsets pour l'affichage, etc etc...) qui sera donc utilisé par le client.

    Tile est une classe abstraite de laquelle héritent mes tiles concrètes : tile de sol classique, de pente, de coin etc etc..., chaque fille spécifiant les comportement propres (pour les collisions par exemple), mais reprenant des attributs et méthodes de la mère (hauteur de la tile par exemple, accesseurs).

    Idem, TileSprite est une classe abstraite de laquelle héritent mes TileSPrite concrètent, qui spécifient le comportement des fonctions de détection d'hovering de la souris, les offsets d'affichage, les positions pour les décros etc...)

    Or, idéalement, la TileSprite fille correspondant à une Tile de coin par exemple, devrait hériter à la fois de la Tile de coin (pour sa logique) et de TileSprite (pour l'affichage).

    Sauf que bien sûr ca n'est pas possible... Et la je vois pas trop comment faire proprement.

    La solution que j'utilise pour l'instant, c'est que mes TileSprites concrètes héritent seulement de TileSprite et possèdent un attribut de Tile (concrète), mais... je trouve ca plutôt moche...

    Résumé si vous êtes perdus :

    Tile (abstraite, logique d'une tile), de laquelle hérite une Tile concrète TileCoin (par exemple)
    TileSprite (abstraite, affichage d'une tile), de laquelle hérite TileCoinSprite (par exemple)

    Sauf que TileCoinSprite devrait aussi hériter de TileCoin (si jamais je veux utiliser des mécanismes de prédiction coté client par ex : il faut aussi que j'ai accès à la logique coté client)

    Voila, si quelqu'un a une idée :s

    Merci d'avance.

    Et pour ceux que ca intéresse : [ame="http://www.youtube.com/watch?v=qitkgiP13gw"]YouTube- Isometric1[/ame] (le moteur en question, en l'état actuel)

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    pour palier à l'héritage multiple, tu peux utiliser les interfaces qui sont des contrats permettant de définir les règles qu'implémente une classe.

    Celà me semble le plus "simple".
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Effectivement, l'utilisation des interfaces est un bon compromis.
    Sinon, tu peux aussi voir du côté du pattern decorator. Je pense qu'il y a un truc à faire avec ça.

  4. #4
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Points : 1 276
    Points
    1 276
    Par défaut
    Oui, ou de passer par :
    - une classe par classe parent,
    - l'enfant dispose de propriétés présentant les instances des parents,
    (style strategie)
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  5. #5
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Salut,

    tu rentres parfaitement dans le cadre d'utilisation des interfaces. Tu peux même implémenter des corps de méthodes pour chaque interface grâce aux méthodes d'extension C#.

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 43
    Points : 53
    Points
    53
    Par défaut
    Merci pour les réponses, mais les interfaces ne résolvent pas mon poblème puisqu'elles ne me permettent pas de définir des attributs (Or Tile et TileSprite comportent toutes les deux des attributs qui sont propres à leur descendants respectifs : je ne me contente pas de définir l'interface de ces classes, je défini aussi partiellement les propriétés).

    MetalGeek, je savais pas que je pouvais implémenter le code de certaines de mes fonctions au sein d'une interface, mais ca me semble un peu bizarre puisque cela impliquerait les même problèmes que ceux posés par l'héritage multiple.

    Pour reprendre ce qui a été dit : certes le problème correspond exactement au cas de l'utilisation d'interfaces (avec des classes implémentant plusieurs (2 en l'occurence) interface), sauf qu'il faut que les dites interfaces possèdent des attributs (des variables donc) et spécifient certaines de leur méthode. Et ca ca s'appelle l'héritage multiple avec des classes.

  7. #7
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Sinon, tu peux faire hériter des types de System.Windows.DependencyObject, et utiliser des propriétés de dépendance attachées pour régler le problème des 'attributs' à définir. Tu gardes aussi les interfaces, et les méthodes d'extension pour implémenter les méthodes.

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Citation Envoyé par syntaxerror Voir le message
    Merci pour les réponses, mais les interfaces ne résolvent pas mon poblème puisqu'elles ne me permettent pas de définir des attributs (Or Tile et TileSprite comportent toutes les deux des attributs qui sont propres à leur descendants respectifs : je ne me contente pas de définir l'interface de ces classes, je défini aussi partiellement les propriétés).
    Intéressant, j'ai eu récemment le même type de problème. On m'a expliqué que de manière générale, on a tendance à sur-utiliser l'héritage de classes pour ajouter du contenu (pour "récupérer/réutiliser" des propriétés typiquement). Tout ça, apparemment, parce qu'on ne fait pas la distinction entre un ajout de données et une modification de comportement. L'héritage de classes ne devrait être utilisé que pour garantir un comportement, pas des données. Pour les données il faudrait préférer la composition. Je dis ça mais j'ai toujours encore le même réflexe que toi.
    Vois avec le pattern decorator comme l'as dit oyigit. Avec ça tu pourras rajouter des fonctionnalités qui ont l'air d'être "héritées". Et pour les données, une relation de composition. On peut faire plein de choses avace la composition qu'on ne soupçonne même pas.
    Sinon, si tu cherches sous "inheritance vs composition" tu trouveras plein de littérature.

    Ou pire, certains se demandent s'il ne faut pas interdire l'héritage de classes.

    Sinon, aussi, pour ton problème d'interface incapable de définir des attributs... Elles sont capables de définir des propriétés. Tu utilises des attributs visible en externe?

  9. #9
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Ce qui me choque, surtout, c'est que tu veuilles faire hériter un objet d'UI d'un objet métier... Donc je verrais plutôt deux hiérarchies de classes en parallèle, l'une métier, l'autre UI, avec de la composition pour relier ces deux univers.
    ಠ_ಠ

  10. #10
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Ou sinon, si ton appli n'est pas censée être transformée tous les 3 mois, tu laisses tomber les 'best practices' qui te font te sentir bien dans le domaine de la théorie, et tu fais 2 ou 3 copiés collés qui te sauvent la vie dans le monde réel.

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    @MetalGeek: tout mais pas le copier/coller !!! Je travaille sur un soft où il traine du copier/coller. Dès que tu veux modifier un truc c'est galère!!! Surtout qu'au fur et à mesure, le copier/coller évolue en un OGM (objet génétiquement modifié) mutant !! Si ça restait exactement le même code, ça resterait possible. Mais vu que le code évolue qd même sournoisement petit à petit (la partie copiée et la partie collée), ensuite c'est difficile de recouper...

  12. #12
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 117
    Points
    117
    Par défaut
    Proverbe perso employé dans ma boite... : copie/coller c'est le maaaaaaaaaaaaaaaaal

Discussions similaires

  1. composants C++ Builder et héritage multiple
    Par vedrfolnir dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/10/2005, 10h04
  2. [heritage][conception]héritage multiple en java!
    Par soulhouf dans le forum Langage
    Réponses: 9
    Dernier message: 25/08/2005, 20h03
  3. L'héritage multiple est-il possible en Delphi ?
    Par SchpatziBreizh dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2005, 11h30
  4. utilisez vous l'héritage multiple ?
    Par vodosiossbaas dans le forum C++
    Réponses: 8
    Dernier message: 13/06/2005, 20h25
  5. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55

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