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

Dotnet Discussion :

Liste de classes héritées


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Par défaut Liste de classes héritées
    Bonjour à tous,

    Je me retrouve bloqué sur un problème tout bête alors je viens vous demander votre aide.
    J'ai les classes ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public abstract class Action: IEquatable<Action>{}
    public class Action_CharacterOperator : Action{}
    public class Action_SpellCaster : Action{}
    J'ai dans une autre classe un tableau d'Action
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Action[] Actions = new Action[39];
    Dans ce tableau j'ai des Action_CharacterOperator et Action_SpellCaster. Mais pas d'Action car c'est une classe abstraite.

    Dans chacune de mes classes filles, j'ai une fonction executeAction() avec des paramètres différents.

    Mon problème est que lors de l'appel de cette fonction depuis mon tableau j'ai une erreur car la classe mère n'a pas de déclaration pour cette fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Actions[1].executeAction(); // ERROR
    Comment faire pour pouvoir appeler cette fonction executeAction() depuis mon tableau d'Action?

    J'ai beau réfléchir je ne vois pas comment faire.
    En sachant que chaque déclaration de cette fonction sont différentes, j'ai un appel du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(currentAction.GetType() == typeof(Action_CharacterOperator)) { currentAction.executeAction(this._characterOperator, keyState); } // ERROR
    else if(currentAction.GetType() == typeof(Action_CharacterControler)) {currentAction.executeAction(this, keyState); } // ERROR
    Est-ce qu'il y a un concept de POO qui m'échappe ?

    D'avance merci pour vos retour.

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 644
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 644
    Par défaut
    on manque de code; as-tu fait les bonnes déclarations dans la déclaration de la classe abstraite notamment ?
    Voir ici et ici notamment

  3. #3
    Membre éclairé Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Par défaut
    Alors pour que vous visualisiez mieux, voici mon code. Je ne vous donne que les déclarations car le contenu n'a aucune importance dans notre problème actuel

    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
    public abstract class Action: IEquatable<Action> {
    	//_____ PROTECTED PROPERTIES _____________________________________________
    	protected Object _pressedDownAction;
    	protected Object _heldAction;
    	protected Object _releasedAction;
     
    	//_____ ACCESSEURS _______________________________________________________	
    	public Object PressedDownAction {}
    	public Object HeldAction {}	
    	public Object ReleasedAction {}
     
    	//_____ METHODES _________________________________________________________
    	public override int GetHashCode () {}
    	public override bool Equals (object obj) {}
    	public bool Equals (Action otherAction) {}
    	public static bool operator == (Action left, Action right) {}
    	public static bool operator != (Action left, Action right) {}
     
    }
     
    public class Action_CharacterOperator : Action {	
    	//_____ PRIVATE PROPERTIES ___________________________________________________
    	CharacterOperator.PossibleActions _targetAction;	
     
    	//_____ CONSTRUCTEURS ______________________________________________________
    	public Action_CharacterOperator (CharacterOperator.PossibleActions tragetAction, bool pressedDownValue = true) {}
     
    	//_____ METHODES ____________________________________________________________
    	public bool executeAction (CharacterOperator characterOperator, InputAdvanced.KeyState keyState) {}
    }
     
    public class Action_CharacterControler : Action {	
    	//_____ PRIVATE PROPERTIES ___________________________________________________
    	CharacterControler.PossibleActions _targetAction;	
     
    	//_____ CONSTRUCTEURS ______________________________________________________
    	public Action_CharacterControler (CharacterControler.PossibleActions tragetAction, bool pressedDownValue = true) {}
     
    	//_____ METHODES ____________________________________________________________
    	public bool executeAction (CharacterControler characterControler, InputAdvanced.KeyState keyState) {}
    }
    Ensuite dans une autre classe j'appelle ces classes comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private Action[] Actions = new Action[39];
    Actions[1] = new Action_CharacterOperator(CharacterOperator.PossibleActions.MovingForward);
    Actions[2] = new Action_CharacterControler(CharacterControler.PossibleActions.LockCursorByInput);
    // ...
     
    // Et plus tard dans le code
    currentAction = Actions[i];
    if(currentAction.GetType() == typeof(Action_CharacterOperator)) { currentAction.executeAction(this._characterOperator, keyState); } // ERROR
    else if(currentAction.GetType() == typeof(Action_CharacterControler)) {currentAction.executeAction(this, keyState); } // ERROR
    J'espère que c'est plus claire

  4. #4
    Membre chevronné Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Par défaut
    Bonjour ,

    Et pourquoi la classe mère n'a pas de déclaration pour executeAction() ?
    Sans déclaration dans la classe mère, tu va devoir caster l'élément en classe fille pour pouvoir l'appelée.

    Pourquoi ne pas déclarer la méthode en virtual dans la classe mère, pour ensuite être en override dans les classes filles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // classe Action     public virtual bool ExecuteAction()
     
    //classe filles      public override bool ExecuteAction() { // du code }
    Bon code,

  5. #5
    Membre éclairé Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Par défaut
    On peut faire un déclaration override avec des signatures différentes sur des fonctions ?
    Il me semblait qu'il fallait que la fonction virtuel et la fonction override devait avoir les mêmes paramètres.

    Je vais tester ça de suite.

  6. #6
    Membre chevronné Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Par défaut
    Ha oups en effet ! on ne peut pas , j'avais pas vu la différence sur la signature (elle est subtile ) .

    Le cast reste une option:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(currentAction is Action_CharacterOperator)) { ((Action_CharacterOperator)currentAction).executeAction(this._characterOperator, keyState); }
    else if(currentAction is Action_CharacterControler)) {((Action_CharacterControler)currentAction).executeAction(this, keyState); }

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

Discussions similaires

  1. Récupérer la liste des classes d'un package
    Par Coulon Arnaud dans le forum Général Java
    Réponses: 20
    Dernier message: 30/12/2010, 00h04
  2. Classe héritée d'une TActionMainMenuBar
    Par Grosbenji dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/08/2006, 15h13
  3. Réponses: 9
    Dernier message: 23/08/2006, 15h12
  4. Liens entre des classes héritées
    Par qwiqwi dans le forum C++
    Réponses: 12
    Dernier message: 09/02/2006, 15h36
  5. Réponses: 2
    Dernier message: 04/12/2005, 21h10

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