Список делегатов и призвание - PullRequest
6 голосов
/ 28 ноября 2010

Я создаю небольшую RPG-игру в ASP.NET.В этой игре у меня есть архитектура предметов, где у каждого предмета есть свои методы.Например, все элементы должны иметь общий метод, такой как " Drop ", " Examine " и " Use ".Некоторые элементы должны быть расширены с помощью таких методов, как " Operate ", " Calculate " и т. Д.

Пока что я создал следующий объект 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();
        }
    }
}

У меня есть класс BaseItem, у которого есть этот GameActionList.Свойство get этого класса BaseItem выглядит следующим образом:

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

Это нормально, НО ... У меня есть некоторые проблемы!

Моя проблема

Мне нужен более общий GameActionList.Мне нужен список не только пустот, но и функций. Кроме того, мне нужны оба метода с параметрами и без параметров.

Например: для метода Drop потребуется Playerобъект, чтобы он мог уронить предмет.Метод Examine должен будет возвращать строку, описывающую элемент.

Кроме того, мне нужны некоторые данные, которые я не знаю, когда инициализирую GameActionList: я сначала узнаю эти данные, когдавызовите метод ...

Итак, у меня есть два вопроса:

  1. Как вы расширяете GameActionList, чтобы он мог содержать список как пустот, так и функций, а также оба они могут иметьпараметры или нет .. (И ДАЖЕ ЛИ ЭТО СМЫСЛ ??)
  2. Как я могу дать некоторые данные методу позже в цикле, как при вызове?

Также ... Это может быть очень глупый способ сделать это, так что если у вас есть какое-то более элегантное решение ... Я более чем готов его услышать !

Спасибо большое...!Lars

1 Ответ

7 голосов
/ 28 ноября 2010

вам, скорее всего, нужны Action, делегаты Func

Func

Действие

...