文章目录
- 示例1:接口(Interface)
- 示例2:抽象类(Abstract Class)
- 示例3:结合使用接口与抽象类
- 示例4:多接口实现
- 示例5:抽象类与接口结合
在Unity中使用C#编程时,接口、抽象类与具体类是面向对象设计中的重要概念。以下通过三个代码实例来讲解它们的设计与使用场景:
示例1:接口(Interface)
场景:
假设我们正在开发一个游戏,需要定义一个“可移动”(IMovable)的接口,以便于所有角色、敌人和道具等都可以实现这个接口,从而具备移动的能力。
// 定义接口IMovable
public interface IMovable
{void Move(Vector3 direction);float Speed { get; set; }
}// 具体类Player实现IMovable接口
public class Player : MonoBehaviour, IMovable
{public float speed;public float Speed{get => speed;set => speed = value;}void Update(){if (Input.GetKey(KeyCode.W)){Move(Vector3.forward * Time.deltaTime * Speed);}}void Move(Vector3 direction){transform.position += direction;}
}// 同样,Enemy类也可以实现IMovable接口
public class Enemy : MonoBehaviour, IMovable
{// 实现Move方法和Speed属性...
}
示例2:抽象类(Abstract Class)
场景:
考虑一个更为复杂的场景,我们有一个基础的实体基类,其中包含一些通用功能,同时希望某些实体具有攻击能力,但不直接提供具体的攻击逻辑,这时可以定义一个抽象的Actor
类,并包含一个抽象的Attack
方法。
// 抽象类Actor
public abstract class Actor : MonoBehaviour
{public int Health { get; protected set; }protected Actor(int initialHealth){Health = initialHealth;}// 抽象方法,由子类实现具体的攻击行为public abstract void Attack(Actor target);// 通用功能,例如显示血量public void DisplayHealthUI(){// 假设此处有UI更新代码}
}// 具体类Knight继承自Actor并实现Attack方法
public class Knight : Actor
{public Knight(int health) : base(health){}public override void Attack(Actor target){if (target is not null){target.Health -= 10; // 假设每次攻击造成10点伤害}}
}// 另一个具体类Mage同样继承自Actor并实现Attack方法
public class Mage : Actor
{public Mage(int health) : base(health){}public override void Attack(Actor target){if (target is not null){target.Health -= 20; // 假设每次攻击造成20点伤害}}
}
示例3:结合使用接口与抽象类
场景:
假设我们的游戏包含不同类型的NPC,有些NPC会说话,有些则不会。我们可以先定义一个抽象的NPC
类,然后用一个ISpeakable
接口来表示那些能说话的NPC。
// 抽象类NPC
public abstract class NPC : MonoBehaviour
{public string Name { get; set; }public abstract void Interact();
}// ISpeakable接口
public interface ISpeakable
{string Speak();
}// 具体类Merchant继承自NPC并实现ISpeakable接口
public class Merchant : NPC, ISpeakable
{public Merchant(string name) {Name = name;}public override void Interact(){Debug.Log($"你与{Name}交谈...");if (this is ISpeakable speakable){Debug.Log(speakable.Speak());}}public string Speak(){return $"欢迎光临,我这里有各种商品出售!";}
}// 具体类Guard类也继承自NPC,但并不实现ISpeakable接口
public class Guard : NPC
{public Guard(string name) {Name = name;}public override void Interact(){Debug.Log($"你尝试与{Name}交谈,但他只是坚守岗位并未回应...");}
}
示例4:多接口实现
场景:
在Unity中,我们可能需要设计一些对象既可以被玩家控制也可以被AI控制。这时可以定义IControllable
(可控制)和IAIControlled
(AI控制)两个接口。
// 定义可控制接口
public interface IControllable
{void TakePlayerInput();
}// 定义AI控制接口
public interface IAIControlled
{void UpdateAI();
}// 具体类Character同时实现两个接口
public class Character : MonoBehaviour, IControllable, IAIControlled
{public void TakePlayerInput(){// 处理玩家输入,例如移动、攻击等Debug.Log("处理玩家输入...");}public void UpdateAI(){// 更新AI逻辑,例如自动寻路、决策等Debug.Log("执行AI逻辑...");}void Update(){if (isPlayerControlled){TakePlayerInput();}else if (isAIControlled){UpdateAI();}}
}
在这个例子中,Character
类可以根据游戏运行时的状态,选择使用玩家输入还是AI逻辑进行操作,体现了接口的灵活性和解耦性。
示例5:抽象类与接口结合
场景:
考虑一个角色系统,角色分为基础角色和英雄角色,基础角色有基本属性如生命值和攻击力,而英雄角色除了基础属性外还有特殊技能。我们可以创建一个抽象角色类,并使用接口来表示具有特定技能的角色。
// 抽象角色类
public abstract class BaseCharacter : MonoBehaviour
{public int Health { get; protected set; }public int AttackPower { get; set; }protected BaseCharacter(int health, int attackPower){Health = health;AttackPower = attackPower;}// 基础攻击方法public virtual void Attack(BaseCharacter target){target.Health -= AttackPower;}
}// 特殊技能接口
public interface ISpecialAbility
{void UseSpecialAbility();
}// 英雄角色类继承自BaseCharacter并实现ISpecialAbility接口
public class Hero : BaseCharacter, ISpecialAbility
{public Hero(int health, int attackPower, string specialSkillDescription) : base(health, attackPower){SpecialSkillDescription = specialSkillDescription;}public string SpecialSkillDescription { get; private set; }// 实现特殊技能public override void Attack(BaseCharacter target){base.Attack(target);UseSpecialAbility();}public void UseSpecialAbility(){Debug.Log($"英雄施展{SpecialSkillDescription},对目标造成额外伤害...");}
}
这个示例展示了如何通过抽象类来封装共享的基础功能,并通过接口让某些具体类具备额外的能力,从而构建出丰富且灵活的角色系统。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(11-20)
50个开发必备的Python经典脚本(21-30)
50个开发必备的Python经典脚本(31-40)
50个开发必备的Python经典脚本(41-50)
————————————————
最后我们放松一下眼睛