2010-11-28 4 views
5

Je crée un jeu RPG plus petit dans ASP.NET. Dans ce jeu, j'ai une architecture d'objets, où chaque élément a des méthodes. Par exemple, tous les éléments doivent partager une méthode comme "Drop", "Examiner" et "Utiliser". Certains éléments devront être étendus avec des méthodes comme "Operate", "Calculer" et autres.Liste des délégués et invocation

Jusqu'à présent, j'ai créé l'objet suivant GameActionList:

public delegate void MyDelegate(); 

public class GameActionList 
{ 
    public List<MyDelegate> Items = new List<MyDelegate>(); 

    public void Add(MyDelegate del) 
    { 
     Items.Add(del); 
    } 

    public void CallDelegates() 
    { 
     foreach (MyDelegate myDelegate in Items) 
     { 
      myDelegate(); 
     } 
    } 
} 

J'ai une classe BASEITEM, qui a cette GameActionList. La propriété get de cela dans la classe BASEITEM est comme ceci:

public GameActionList Actions 
    { 
     get 
     { 
      GameActionList actions = new GameActionList(); 
      actions.Add(this.Drop); 
      actions.Add(this.Examine); 
      return actions; 
     } 
    } 

Cela est bien, mais ... j'avoir des problèmes!

Mon problème

Je besoin d'un moyen de GameActionList plus générique. J'ai besoin d'avoir une liste non seulement des vides, mais aussi des fonctions. Aussi, j'ai besoin des deux méthodes avec des paramètres et sans paramètres. Par exemple: La méthode Drop nécessite un objet Player, afin qu'il puisse déposer l'élément. La méthode Examiner devra renvoyer une chaîne décrivant l'élément.

Aussi, je besoin de quelques données que je ne sais pas quand j'Initialisez le GameActionList: je sais d'abord ces données quand j'invoque la méthode ...

J'ai donc deux questions:

  1. Comment étendez-vous GameActionList, de sorte qu'il peut contenir une liste des vides et des fonctions et aussi les deux peuvent avoir des paramètres ou non .. (ET MÊME FAIRE SENS ??)
  2. Comment puis-je donner quelques données à la méthode plus tard dans le cycle, comme lors de l'invocation?

aussi ... Cela pourrait être une façon très stupide de le faire, donc si vous avez une certaine façon de solution plus élégante .. Je suis plus prêt à l'entendre!

Merci beaucoup ...! Lars

+0

Merci beaucoup pour avis :) Je ne savais pas cette fonction .. acceptais les bonnes réponses des dernières questions .. :-) –

Répondre

7

vous le plus probablement besoin d'action, les délégués Func

Func

Action

+0

Merci beaucoup .. Juste fait des recherches et mis à jour mon code - ça marche vraiment bien! Maintenant, je dois juste apprendre le DynamicInvoke .. Oh bien! Super :) Merci –