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 :

Architecture / Librairie générique


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut Architecture / Librairie générique
    Bonjour,

    Je cherche à résoudre le problème d'architecture suivant. D'un côté une librairie générique qui contient à la fois une hiérarchie et des structures de classe (fonctions, types d'objets encapsulés, ...). De l'autre côté, l'implémentation de cette librairie sur un problème concret.

    Librairie générique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IBase<IResource>[Initialize(), Run()] -> IBaseType1<IResourceType1>,  IBaseType1<IResourceType2> -> ...  -> IBaseType1.A.IV<IResourceType1.A.IV>
    Implémentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AbstractType1:IBaseType1<ResourceType1>
    ConcreteType1:AbstractType1, IBaseType1.A.IV<ResourceType1.A.IV>
    Mon problème vient de l'organisation de la hiérarchie : je veux pouvoir implémenter un niveau hiérarchique de la structure de base, pour pouvoir par exemple faire une fonction Initialize() commune (classe AbstractType1), mais aussi avoir les fonctions spécifiques d'un sous-niveau (classe ConcreteType1). Pour ça, j'ai l'impression qu'on ne peut travailler qu'avec des interfaces dans la librairie générique.
    L'architecture que j'ai implémenté ci-dessous me pose deux problèmes:

    1.
    Lorsque je déclare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IBase<ResourceType1> instance = new ConcreteType1();
    instance.Initialize()
    , on ne passe pas dans ConcreteType1.Initialize(), même si cette fonction est déclarée en 'new' par rapport à AbstractType1.Initialize()

    2.
    Avec les interfaces, je ne peux renseigner aucun code dans la librairie générique alors qu'il y a du code générique (commun à toutes les branches ou spécifiques à certaines) que j'aimerais décrire, par exemple la fonction Run() du dernier élément d'une branche.


    Merci d'avance pour vos lumières !

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Le problème est il bien lié a une "Librairie" et aux "génériques" ?
    Ou est ce un problème d'héritage et de polymorphisme ?

    Ton exemple me fait mal à la tête et aux yeux, n'est il pas simplifiable afin de reproduire le problème.

    Il ne faut pas créer ton objet de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ConcreteType1 instance = new ConcreteType1()
    Sinon, je tenterai un cast sur "instance" en "ConcreteType1" afin d'utiliser le bon "Initialize".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((ConcreteType1) instance).Initialize()

  3. #3
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    Ericlm,

    Merci de ta réponse.
    J'ai résolu mon problème #1 d'accès à Initialize(), en fait le mot-clé 'new' n'est pas suffisant, il faut carrément utiliser 'override'. Le pourquoi du comment est expliqué ici.
    Cependant, en utilisant 'override' avant de définir Initialize() dans ConcreteType1, il n'y a pas besoin de faire le cast que tu mentionnes (et qu'on essaie d'éviter justement).

    ...the implementation of an interface method is implicitly 'final', just as if the 'sealed' and 'override' modifiers were present.
    Yup, you read that right: implementing an interface method implicitly seals the method (as well as overriding it). So, unless you tell it otherwise, the first implementation of an interface ends the override chain in C#.
    Pour le problème #2, je pense que mon architecture n'est pas la meilleure pour résoudre le problème, et c'est pour ça que je viens demander vos avis.
    La formulation n'est pas géniale, j'aimerais bien dans l'idéal faire des schémas, mais je ne vois pas d'outils qui permettent de faire ça sur developpez.net.

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Luigicube Voir le message
    La formulation n'est pas géniale, j'aimerais bien dans l'idéal faire des schémas, mais je ne vois pas d'outils qui permettent de faire ça sur developpez.net.
    Pour ca tu peux tout simplement utiliser Paint, Visio ou autre ensuite il suffit d'uploader ton oeuvre en tant que pièce jointe : Lire et écrire des messages
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    Mes talents d'artiste sont encore plus pauvres que mes talents d'écrivain, malheureusement.
    Un problème que je rencontre avec l'architecture ci-dessus :

    Librairie générique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IBase<E> where E:IElement {E ParameterExample {get; set; }
    IBaseExtension<Ext> : IBase<Ext> where Ext:IElement {}
    Implémentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Element : IElement
    ExtElement : IElement
    AbstractBase : IBase<Element>
    ConcreteBase : AbstractBase, IBaseExtension<ExtElement>
    ConcreteBase doit implémenter ParameterExample 2 fois :
    - 1 fois venant de IBase (via AbstractBase), avec comme type de retour Element
    - 1 fois venant de IBaseExtension, avec comme type de retour ExtElement

    Comment s'en tirer ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Si tu as un objet polymorphe, tu devra caster l'objet afin d'utiliser la méthode lier au type que tu souhaite (sauf pour le type native de l’objet).

    J'ai effectuer quelques tests, ma première réponse devrai tout de même répondre au besoin (1). Et je trouve que ta nouvelle question s'y rapporte aussi.

Discussions similaires

  1. Librairie Javascript dans une architecture J2EE
    Par jimboo dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 14/12/2011, 13h25
  2. Réponses: 1
    Dernier message: 27/10/2010, 23h08
  3. Réponses: 25
    Dernier message: 17/11/2008, 09h11
  4. Réponses: 3
    Dernier message: 23/03/2008, 13h23
  5. Architecture multi couches avec librairie borland?
    Par seb_asm dans le forum JBuilder
    Réponses: 4
    Dernier message: 08/06/2005, 10h14

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