如何在 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
因为它也是 public
和 get; set
是完全多余的。你也可以做到
public float CooldownDuration { get; set; }
并改用它。接口只定义了 属性 的 minimum 要求,但也允许给它一个 setter,即使接口不需要。
只要你的class能写入,你也能做到
public float CooldownDuration { get; private set; }
或者如果还允许 subclasses 设置值
public float CooldownDuration { get; protected set; }
我有这个接口 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
因为它也是 public
和 get; set
是完全多余的。你也可以做到
public float CooldownDuration { get; set; }
并改用它。接口只定义了 属性 的 minimum 要求,但也允许给它一个 setter,即使接口不需要。
只要你的class能写入,你也能做到
public float CooldownDuration { get; private set; }
或者如果还允许 subclasses 设置值
public float CooldownDuration { get; protected set; }