你在找什么是接口,或抽象/虚拟功能。广义地说,有两种技术:
public abstract class Character : MonoBehaviour
{
public float m_Health { get; protected set; }
protected abstract float DefaultHealth { get; }
void Awake()
{
m_Health = DefaultHealth;
}
}
public class Enemy : Character
{
protected override float DefaultHealth { get { return 10; } }
}
(使用虚拟函数而不是抽象如果应该有一个基实现和压倒一切的是可选的。)使用上述图案时,所述逻辑被所有共享,但很少位在子类中有不同的规定。基类中的大功能调用可能在子类中指定的小函数。
第二种技术是用于对上述类看起来一样到外面的世界,但在根本上有不同的功能:
public interface ILiving
{
float Health { get; }
}
public class Character : ILiving
{
// implement health as a normal variable
public float Health { get; protected set; }
}
public class OldMan : ILiving
{
// implement health based on time until death at 2020
public float Health { get { return (2020-DateTime.Now.Year)/20; } }
}
在这种情况下,两种类型都具有健康,但逻辑通过其操作是不同的。对外界来说,它们看起来是一样的,但它们如此不同以至于它们不应该共享任何逻辑。
请注意,在Unity中,事情可能会变得混乱。由于我们被迫继承了MonoBehaviour
(而C#没有多重继承),所以我们偶尔不会在我们想要的地方使用继承。在这些情况下,我们可以通过使用接口,显式接口实现(合理的传真保护功能)和扩展方法来模仿继承。 (定义扩展方法的类将扮演基类的角色。)通常,当类想要成为两个类层次结构的一部分(基于两个不可调和的功能集)时,就会出现这种情况。在游戏中,装甲,武器和法术可能都希望参与升级系统。装甲和武器是装备等级体系的一部分,但法术不是。所以相关数据被制作成接口函数,并且共享代码被定义为扩展方法(因为除了MonoBehaviour
之外,装甲和法术不共享公共基类)。
感谢这个细节! –