Statisti c добавление числа с плавающей запятой с использованием делегата float - PullRequest
0 голосов
/ 26 мая 2020

Я строю статистическую c систему. В системе есть определенная статистика, которая полагается на другую статистику для расчета их окончательного значения. Вот моя первоначальная попытка:

public class ModdedStat
{
    public delegate float Mod();
    public Mod mod;
    public float baseStat;
    public float finalStat
    {
        get
        {
            return baseStat + mod();
        }
    }
}

К сожалению, это return baseStat + последний слушатель, подписанный на мод. Я проверял это следующим образом:

stat.baseStat = 0;
stat.mod += Out1;
stat.mod += Out2;
Console.Write(stat.finalStat);

Out1 и Out2 - это функции, возвращающие 1 и 2 соответственно. Консольная запись вернула «2».

Я никогда раньше не использовал делегаты возвращаемого типа, поэтому я не уверен, что не так с моим logi c. Есть ли решение, подобное этому, или даже совсем другой способ обхода?

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Это происходит потому, что по умолчанию при вызове многоадресной рассылки будут выполняться все добавленные вами делегаты с использованием +=, но возвращаемое значение будет тем из последнего добавленного вами делегата. В конце концов, один вызов может вернуть только одно значение.

, если вы хотите получить результат 3, вы можете использовать GetInvocationList, чтобы получить делегатов, которые вы добавили с помощью += в делегат многоадресной рассылки. Затем вы можете l oop через массив и добавить возвращаемые значения вверх.

public float finalStat
{
    get
    {
        float totalMod = 0;
        foreach(Mod m in mod.GetInvocationList()) {
            totalMod += m();
        }
        return baseStat + totalMod;
    }
}
0 голосов
/ 26 мая 2020

Альтернативой использованию delegate с GetInvocationList для этого сценария может быть Func:

var funcs = new List<Func<int>>();
funcs.Add(Out1);
funcs.Add(Out2);

funcs.Sum(f => f());

Или использование вашего класса:

public class ModdedStat
{
    readonly List<Func<int>> funcs = new List<Func<int>>();

    public void AddFunc(Func<int>)
    {
        funcs.Add(func);
    }

    public float baseStat;
    public float finalStat => baseStat + funcs.Sum(f => f());
}

Затем:

stat.baseStat = 0;
stat.AddFunc(Out1);
stat.AddFunc(Out2);
Console.Write(stat.finalStat);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...