我有一个具有以下属性的接口IHasCooldown
:
int Id { get; }
float CooldownDuration { get; }
在另一个类(让我们称之为Attack
(中,我将Id
设置为atkId
,将CooldownDuration
设置为attackCooldown
。attackCooldown
是一个属性,因此它可以更改。
public float attackCooldown { get; set; }
int atkId = 2;
public int Id => atkId;
public float CooldownDuration => attackCooldown;
最后,在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上设置attakCooldown应该是有效的,每次使用CooldownDuration都会计算最新的值。
顺便说一下:
public float CooldownDuration => attackCooldown equals public float CooldownDuration { get { return attackCooldown; } }
您的
public float CooldownDuration => attackCooldown;
是属性。如果没有lambda表达式,您也可以将其写成
public float CooldownDuration
{
get { return attackCooldown; }
}
这不是设置一次,而是始终返回attackCooldown
的当前值
注意,由于attackCooldown
也是public
和get; set
,因此它是完全冗余的。你也可以把它做成
public float CooldownDuration { get; set; }
并使用它。接口只定义了属性的最小要求,但也允许为其提供一个setter,即使接口不需要它。
如果只有你的班级能够写信给它,你也可以让它成为
public float CooldownDuration { get; private set; }
或者如果也允许子类设置值
public float CooldownDuration { get; protected set; }