C# - public getter 和受保护的 setter 接口

C# - public getter and protected setter interface

您好,我正在开发一款 Unity 游戏,我想创建生物实体。

要执行此操作,我想为所有具有健康状况的实体创建一个接口

这是我的 LivingEntities 界面:

public interface ILivingEntity
{
    public float Hp { get; protected set; }
    public float MaxHp { get; protected set; }
    public float HpRegenPerSecond { get; protected set; }

    public event EventHandler Event_died;

    protected virtual void Awake()
    {
        MaxHp = Hp;
    }

    protected virtual void receiveDamage(IAttack attackSource)
    {
        Hp -= attackSource.damage;
        watchForEntityDeadOrNot();
    }

    protected abstract void watchForEntityDeadOrNot();

    protected void regenHp()
    {
        Hp += Time.deltaTime * HpRegenPerSecond;
        if (Hp > MaxHp)
            Hp = MaxHp;
    }
}

重点是:

我看到了这样的技巧:

在界面中:

public float Hp{get;}

并在实施中:

public float Hp{
  get{code...}
  protected set{code...}
}

但在我的例子中,如果我只在子 class 实现中定义 setter,我将无法在接口中为我的 'regenHp' 方法提供任何代码。

如何执行此操作?

而不是像评论中建议的那样使用抽象基础 class,您可以利用 Unity 的内置组件设计,这是解决此类问题的标准方法。游戏对象由许多组件组成是很常见的。

您可以像这样定义共享组件:

public class LivingComponent : MonoBehavior
{
    ...
}

然后在你的主要组件中依赖它:

[RequireComponent(typeof(LivingComponent))]
public class SomeLivingThing : MonoBehavior {}

如果您仍然拥有 read-only 界面很重要,您也可以这样做:

public interface ILivingEntity {
   // Getters only here
}

public class LivingComponent : MonoBehavior, ILivingEntity {
   // Implementation
}

// In some other code:
var hp = obj.GetComponent<ILivingEntity>().Hp;