如何在 C# 中更改 属性 的输入值后更新它的值?

How can I update a property's value after changing it's input value in C#?

我有这个接口 IHasCooldown 具有这些属性:

int Id { get; }
float CooldownDuration { get; } 

在另一个 class(我们称之为 Attack)中,我将 Id 设置为 atkId,将 CooldownDuration 设置为 attackCooldown . attackCooldown 是 属性,因此可以更改。

public float attackCooldown { get; set; }
int atkId = 2;
public int Id => atkId;
public float CooldownDuration => attackCooldown;

最后,在 class SubAttack 中,我将 attackCooldown 设置为 10。但是由于 CooldownDuration 是在开始时设置的,因此不会计算之后的任何更改.

此外,lambda 运算符对我来说还有些棘手。这部分内容来自教程。

我很想听听有关如何解决此问题的一些想法!

我得到的冷却系统来自这里,但由于它不考虑可变时间,所以我稍微调整了一下。 https://www.youtube.com/watch?v=2zGvt4NnIYw

根据您的描述,代码应该是:

class Program
{
    static void Main(string[] args)
    {
        var subAttack = new SubAttack();
        Console.WriteLine("Please Input CooldownDuration:");
        var input = int.Parse(Console.ReadLine());
        subAttack.PrintAttackCooldown();
        subAttack.PrintAttackCooldown(input);
        Console.ReadKey();
    }


}

interface IHasCooldown
{
    int Id { get; }
    float CooldownDuration { get; }
}

class Attack : IHasCooldown
{
    public float attackCooldown { get; set; }
    int atkId = 2;
    public int Id => atkId;
    public float CooldownDuration => attackCooldown;
}

class SubAttack : Attack
{
    public void PrintAttackCooldown()
    {
        Console.WriteLine($"CooldownDuration is {CooldownDuration}");
    }

    public void PrintAttackCooldown(int cooldown)
    {
        attackCooldown = cooldown;
        Console.WriteLine($"You Input CooldownDuration is {CooldownDuration}");
    }
}

输出为:

Please Input CooldownDuration:
9
CooldownDuration is 0
You Input CooldownDuration is 9

因此,在SubAttack上设置attackCooldown应该是有效的,每次使用CooldownDuration都会计算最新的值

顺便说一句:

public float CooldownDuration => attackCooldown equals public float CooldownDuration { get { return attackCooldown; } }

你的

public float CooldownDuration => attackCooldown;

是一个Property。如果没有 lambda 表达式,您也可以将其写为

public float CooldownDuration
{
    get { return attackCooldown; }
}

这是不是设置一次而是总是returnsattackCooldown的当前值。


请注意 attackCooldown 因为它也是 publicget; set 是完全多余的。你也可以做到

public float CooldownDuration { get; set; }

并改用它。接口只定义了 属性 的 minimum 要求,但也允许给它一个 setter,即使接口不需要。

只要你的class能写入,你也能做到

public float CooldownDuration { get; private set; }

或者如果还允许 subclasses 设置值

public float CooldownDuration { get; protected set; }