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++/CLI Discussion :

Méthode virtuelle statique


Sujet :

C++/CLI

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Points : 9
    Points
    9
    Par défaut Méthode virtuelle statique
    C'est la première fois que je me pointe ici, ça me semble très complet mais je n'ai pas trouvé la réponse à mon petit problème, pourtant basique... Je me lance donc :

    J'ai une classe abstraite qui me sert à définir quelques méthodes virtuelles pures comme l'opération suivante (où "Data" désigne le type de mes données de sortie)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public ref class AbstractFileLoader abstract {
        public virtual Data^ load(const System::String^ monfichier) abstract;
    };
    De cette classe FileLoader, je souhaite faire hériter plusieurs classes différentes, une par extension : je vais donc avoir par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public ref class ABCLoader : public AbstractFileLoader {
        public virtual Data^ load(const System::String^ monfichier) override;
    };
    Jusqu'ici tout va bien. Je souhaite compliquer la chose en appliquant à tous les héritiers de AbstractFileLoader le pattern Singleton, histoire de ne créer qu'un unique chargeur de fichier par type de fichier...
    Il me faut donc déclarer pour chaque classe héritière un membre statique ABCLoader^ _ME, et introduire la méthode habituelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static ABCLoader^ ABCLoader::getInstance();
    qui va me permettre d'éventuellement créer et essentiellement récupérer cette instance unique _ME de la classe ABCLoader.

    Pour utiliser l'intérêt de la notion d'héritage, il pourrait me venir à l'idée d'imposer la création de cette méthode getInstance() au niveau de la classe mère, à l'aide d'une méthode virtuelle pure, à l'instar de la méthode load().
    Seulement là ça coince, puisque getInstance() est statique (en effet, elle est responsable de l'unique instanciation de la classe concernée)


    Et maintenant, mes petites questions à propos de ce problème :
    - quel est l'intérêt d'empêcher une méthode statique d'être déclarée virtuelle ? Si démonstration il y a, j'aimerais tant qu'à faire qu'elle soit appliquée à mon exemple pour que je puisse bien en voir les enjeux, SVP...
    - ce que je tente de faire est-il donc impossible ?
    - est-ce que j'aurais un défaut de conception qq part ?
    - à part ça, ça va bien ? Comme je le disais, je suis nouveau ici, et rassurez-vous je n'ai pas l'intention de poster des romans régulièrement...
    Mais bon, je ne voudrais pas non plus passer pour quelqu'un de grossier, donc je vous salue et vous souhaite un excellent week-end tout en vous remerciant par avance de votre participation !

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Petit rappel sur les méthodes virtuelles : C'est à partir du contenu de l'objet (son pointeur de vtable) qu'on sait quelle fonction appeler.
    Petit rappel sur les méthodes statiques : Elle s'appellent sans objet.


    Sachant cela, tu m'expliqueras comment faire une méthode statique virtuelle.
    Edit: Et comment tu comptes l'appeler...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Médinoc
    Sachant cela, tu m'expliqueras comment faire une méthode statique virtuelle.
    Edit: Et comment tu comptes l'appeler...
    Merci de ta réponse Médinoc...
    Eh bien justement, je donne au-dessus un exemple, qui est peut-être un peu touffu, mais que je résume :

    disons qu'on a plusieurs objets dont on souhaite qu'ils implémentent le même interface Singleton...
    La particularité du Singleton est de posséder un constructeur privé, et une méthode statique getInstance() qui permet de récupérer (ou de créer, la première fois) l'unique instance du Singleton...

    Ce sont ces propriétés que je souhaitais transmettre de l'interface Singleton à toutes les classes qui l'implémentent... Et j'avais pour cela besoin de pouvoir déclarer la méthode statique getInstance() comme une méthode abstraite...

    Au final, j'ai simplement programmé chaque objet comme un singleton, en abandonnant l'idée d'un interface commun... Mais j'ai tout de même l'impression que mon cas précis montre que l'on pourrait ici avoir une méthode statique virtuelle tout à fait appropriée !

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le terme "méthode statique virtuelle" est incorrect, car tu ne peux utiliser une méthode virtuelle sans une instance de l'objet.

    Le bon terme serait plutôt un "contrat" que chaque singleton devrait respecter...


    Sinon, tu peux tenter avec un template, pour des conteneurs de singleton...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Appel d'une méthode virtuelles
    Par BIPBIP59 dans le forum C++Builder
    Réponses: 4
    Dernier message: 24/03/2006, 14h00
  2. Méthodes virtuelle et implémentation
    Par slate dans le forum C++
    Réponses: 2
    Dernier message: 16/02/2006, 17h16
  3. méthodes virtuelles
    Par ep31 dans le forum C++
    Réponses: 2
    Dernier message: 09/11/2005, 17h21
  4. Comment l'appel à une méthode virtuelle....
    Par Blobette dans le forum C++
    Réponses: 7
    Dernier message: 07/12/2004, 13h55
  5. [C#] Méthode virtuelle
    Par jacma dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/11/2004, 08h18

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