Skip to content

抽象类

unity-csharp-abstract-class-system

抽象类是什么

抽象类就是“不能直接创建对象的父类模板”。它常用来规定子类必须实现哪些能力,同时也可以放一些通用代码。

c
public abstract class Skill
{
    public abstract void Cast();

    public virtual void Cooldown()
    {
        Debug.Log("进入冷却");
    }
}

这里有两个重点:

abstract class SkillSkill 是抽象类,不能直接 new Skill()abstract void Cast():只声明“必须会释放技能”,但不写具体怎么释放。

子类必须补完:

c
public class FireballSkill : Skill
{
    public override void Cast()
    {
        Debug.Log("发射火球");
    }
}

abstract 和 virtual 的区别

abstract:没有方法体,子类必须实现。

c
public abstract void Cast();

virtual:有默认实现,子类可以选择重写,也可以不重写。

c
public virtual void Cooldown()
{
    Debug.Log("默认冷却");
}

普通方法:有实现,默认不能被 override

c
public bool HasEnoughMana()
{
    return mana >= cost;
}

Unity 里怎么用

比如所有敌人都有血量、受伤、死亡逻辑,但攻击方式不同:

c
public abstract class EnemyBase : MonoBehaviour
{
    [SerializeField] protected int hp = 100;

    public abstract void Attack();

    public virtual void TakeDamage(int damage)
    {
        hp -= damage;
        if (hp <= 0) Die();
    }

    protected virtual void Die()
    {
        Destroy(gameObject);
    }
}

具体 Boss 必须实现攻击:

c
public class BossEnemy : EnemyBase
{
    public override void Attack()
    {
        Debug.Log("Boss 范围攻击");
    }
}

新手记住: EnemyBase 是模板,不是完整敌人。 BossEnemy 才是具体敌人。 抽象类适合放“共同规则 + 必须由子类完成的行为”。

抽象类 vs 接口

抽象类:它们是同一种大类,而且有共同代码。 比如 EnemyBase -> BossEnemy / ArcherEnemy

接口:它们不一定是同一种东西,但有同一种能力。 比如 IDamageable -> Player / Enemy / BreakableBox

参考链接

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0