在我的代码中有一个接口damagable:
public interface Damagable
{
public static float maxHealth { get; set; }
public float currentHealth { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
不同的类实现damagable,其中currentHelath每个实例都是唯一的。这个想法是,给定类型的不同实例都将共享相同的内容maxHealth,以处理诸如基于 的再生和损坏之类的事情maxHealth。
这里的关键字能static解决问题吗?
我可以maxHealth在每个类的构造函数中进行设置,但我希望有一种方法可以使其每个类都是静态的。
有没有办法让接口属性在实现它的每个类上都不同,而该类的每个实例都具有相同的值,或者是否有更好的方法来做到这一点?
最终我将有多个类,例如:
public class LargeObstacle : Damagable
{
public float maxHealth { get; set; } = 100;
public float currentHealth { get; set; }
}
public class SmallObstacle : Damagable
{
public float maxHealth { get; set; } = 40;
public float currentHealth { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我可以在不知道每个元素的类的情况List<Damagable>下整合并获得它。maxHealth
您可以将其设为具有静态支持字段的实例属性(遵守 C# 命名约定):
public interface IDamagable
{
float MaxHealth { get; set; }
float CurrentHealth { get; set; }
}
public class Damagable : IDamagable
{
private static float _maxHealth;
public float MaxHealth { get => _maxHealth; set => _maxHealth = value; }
public float CurrentHealth { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
C# 11在接口中引入了静态虚拟成员,允许有效地声明必须由类实现的静态成员:
public interface IDamagable
{
static abstract float MaxHealth { get; set; }
float CurrentHealth { get; set; }
}
public class Damagable : IDamagable
{
public Damagable()
{
CurrentHealth = MaxHealth;
}
public static float MaxHealth { get; set; } = 100;
public float CurrentHealth { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
测试:
var d1 = new Damagable();
Damagable.MaxHealth = 95;
var d2 = new Damagable();
var d3 = new Damagable();
Console.WriteLine(d1.CurrentHealth);
Console.WriteLine(d2.CurrentHealth);
Console.WriteLine(d3.CurrentHealth);
Run Code Online (Sandbox Code Playgroud)
印刷:
100
95
95
Run Code Online (Sandbox Code Playgroud)
如您所见,您必须MaxHealth通过类型 name进行访问Damagable,因为它未绑定到实例。
如果MaxHealth是常量值,那么也可以声明常量。常数本质上是静态的。
public const float MaxHealth = 40;
Run Code Online (Sandbox Code Playgroud)