抱歉,在这个问题上我有点空白。例如,假设我有一个基类Character和两个子类FriendlyCharacter和EnemyCharacter。我希望它们都继承诸如健康之类的变量,但是我不应该使“角色”中的健康变量公开吗?我会假设,如果我更改了一个友好字符的公共变量,它将更改所有健康状况正确的实例吗?

我将如何初始化Character以包含将由其他类继承的变量?继承后,这些类将具有该变量的自己的实例。我觉得只需要在每个子类中重新初始化变量就可以使基类中的初始化毫无意义。

我将不胜感激任何帮助。

最佳答案

您正在寻找的是接口或抽象/虚拟功能。广义上讲,有两种技术:

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除外)。

09-10 03:27
查看更多