Appearance
抽象类
抽象类是什么
抽象类就是“不能直接创建对象的父类模板”。它常用来规定子类必须实现哪些能力,同时也可以放一些通用代码。
c
public abstract class Skill
{
public abstract void Cast();
public virtual void Cooldown()
{
Debug.Log("进入冷却");
}
}这里有两个重点:
abstract class Skill:Skill 是抽象类,不能直接 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。
参考链接