在我代码中有一个接口damagable

public interface Damagable
{
    public static float maxHealth { get; set; }
    public float currentHealth { get; set; }
}

不同的类实现Damagable,其中currentHelath是每个实例唯一的.这个 idea 是,给定类型的不同实例都将共享相同的MaxHealth,以处理基于maxHealth的重新生成和损害之类的事情.这里的静态关键字能解决这个问题吗?

我可以只在每个类的构造函数中设置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; }
}

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; }
}

C#11引入了static virtual members in interfaces,允许有效地声明必须由类实现的静态成员:

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; }
}

测试:

Damagable.MaxHealth = 100;
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);

打印:

100
95
95

如您所见,您必须通过类型名Damagable访问MaxHealth,因为它没有绑定到实例.

Csharp相关问答推荐

访问C#中的数据库字段时获取数据是收件箱错误-为什么?&有效,如果声明不有效

在WPF.NET 6中使用C++/WinRT组件(但实际上是任何WinRT组件)

如何在NServicebus中配置学习传输的文件夹(NService bus 8)

找不到网址:https://localhost:7002/Category/Add?区域= Admin.为什么我的URL是这样生成的?area = Admin而不是/Admin/

Blazor Foreach仅渲染最后一种 colored颜色

从应用程序图API调用访问所有者字段

为什么任务需要在内部使用ManualResetEventSlim?

.NET SDK包中的官方C#编译器在哪里?

Selify只更改第一个下拉菜单,然后忽略REST-C#

VS 2022与VS 2019:如何/为什么创建额外的任务?

Blazor Server.NET 8中的Blazore.FluentValidation问题

如何在特定环境中运行dotnet测试?

用于请求用户返回列表的C#Google API

错误:此版本的Visual Studio无法打开以下项目

Visual Studio,Docker容器-容器调用:连接被拒绝

毛伊岛.NET 8图片不再适合按钮

Azure函数正在返回值列表,但该列表在Chrome中显示为空

忽略Visual Studio代码中的StyleCop规则

try 访问字典中的模拟对象时引发KeyNotFoundException

如何更改Datagridview行标题