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;
}
}
重点是:
- 我需要 hp 在 get
中是 public
- 我想在我的界面中提供每秒生命值再生的代码(不要在每个生物实体中重新实现相同的代码)
- 我希望只从生物体自身设置生命值
我看到了这样的技巧:
在界面中:
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;
您好,我正在开发一款 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;
}
}
重点是:
- 我需要 hp 在 get 中是 public
- 我想在我的界面中提供每秒生命值再生的代码(不要在每个生物实体中重新实现相同的代码)
- 我希望只从生物体自身设置生命值
我看到了这样的技巧:
在界面中:
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;