每个实现都有唯一的静态接口属性吗?

Dag*_*ann 3 c#

在我的代码中有一个接口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

Oli*_*bes 8

您可以将其设为具有静态支持字段的实例属性(遵守 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)