C# 中有两种主要的抽象类型:抽象类(abstract class)和接口(interface)。
角色系统的基础:在游戏中,抽象类可以作为各种角色类型的基类,定义一些通用的属性和行为。例如,定义一个 Character 抽象类,包含 Health(生命值)、Mana(魔法值)等属性,以及 TakeDamage(受到伤害)、Heal(治疗)等方法。不同的角色类,如 Warrior(战士)、Mage(法师)可以继承自 Character 类,并根据自身特点重写一些方法。
游戏对象的通用框架:对于游戏中的各种对象,如道具、场景元素等,可以使用抽象类来定义它们的通用行为和属性。例如,定义一个 GameObject 抽象类,包含 Position(位置)、Rotation(旋转)等属性,以及 Update(更新)、Draw(绘制)等方法。不同类型的游戏对象可以继承自 GameObject 类,并实现自己的 Update 和 Draw 方法。
行为的模块化:在游戏中,一个对象可能需要具备多种不同的行为,通过接口可以将这些行为模块化。例如,定义一个 IAttackable 接口,包含 Attack 方法,定义一个 IDefendable 接口,包含 Defend 方法。一个角色类可以同时实现这两个接口,以具备攻击和防御的能力。
系统交互的规范:接口可以用于定义不同游戏系统之间的交互规范。例如,定义一个 ISaveable 接口,包含 Save 和 Load 方法,游戏中的各种对象(如角色、关卡数据等)如果实现了这个接口,就可以方便地进行保存和加载操作。这使得游戏的存档系统可以统一地处理各种实现了 ISaveable 接口的对象。
抽象类
// 定义一个抽象类
abstract class Shape
{
// 抽象方法,用于计算面积
public abstract double Area();
// 非抽象方法
public void DisplayInfo()
{
Console.WriteLine($"This is a {GetType().Name}");
}
}
// 继承自Shape抽象类的Circle类
class Circle : Shape
{
private double radius;
public Circle(double radius)
{
this.radius = radius;
}
// 实现抽象方法
public override double Area()
{
return Math.PI * radius * radius;
}
}
在上述代码中,Shape 是一个抽象类,其中 Area 方法是抽象方法,DisplayInfo 是非抽象方法。Circle 类继承自 Shape 类,并实现了 Area 抽象方法。
接口
// 定义一个接口
interface IPrintable
{
void Print();
}
// 实现IPrintable接口的Book类
class Book : IPrintable
{
private string title;
public Book(string title)
{
this.title = title;
}
// 实现接口方法
public void Print()
{
Console.WriteLine($"Book title: {title}");
}
}
在这个例子中,IPrintable 是一个接口,Book 类实现了 IPrintable 接口,因此必须实现 Print 方法。
抽象类型不能直接使用 new 关键字创建对象,因为它们的设计目的是作为其他类型的基础,由具体的派生类来提供完整的实现。
抽象类型通过多态性允许在运行时根据对象的实际类型来调用相应的方法。这使得代码更加灵活和可维护,能够适应不同的需求变化。
抽象类(abstract):可以包含抽象成员和非抽象成员,
接口(interface):接口中所有成员都是抽象的,不包含任何实现代码,默认是Public,不能包含任何字段
抽象类 abstract :一个类只能继承一个抽象类,因为 C# 不支持多重继承。
接口 interface :一个类可以实现多个接口,这使得类能够灵活地满足多种不同的行为
抽象类 abstract :抽象类成员可以有不同的访问修饰符,public,private,protected(可被派生类访问)
接口 interface :默认是public,不能指定其它,这是因为接口的目的是定义外部可见的行为契约。
抽象类 abstract :抽象类可以为派生类提供一些默认实现,派生类可以重写或使用默认
接口 interface :只定义签名,实现接口的类,必须完全实现接口中的所有成员,没有默认实现可以继承,因此接口更加侧重于定义行为规范(标准化,模块化)