声明方式
抽象方法:使用
abstract
关键字声明,没有具体实现。虚方法:使用
virtual
关键字声明,可以有默认实现。
实现要求
抽象方法:派生类必须实现所有的抽象方法,否则派生类也必须声明为抽象类。
虚方法:派生类可以选择是否重写虚方法,如果不重写,则默认使用基类的实现。
所在类的要求
抽象方法:只能在抽象类中声明。
虚方法:可以在普通类和抽象类中声明。
调用方式
抽象方法:不能直接调用,必须通过派生类的实现来调用。
虚方法:可以直接调用,如果派生类重写了虚方法,则调用派生类的实现;否则,调用基类的实现。
下面是一个简单的示例代码,展示了抽象方法和虚方法的区别:
// 抽象类:形状
abstract class Shape
{
// 抽象方法:计算面积
public abstract double CalculateArea();
// 虚方法:获取形状信息
public virtual string GetInfo()
{
return "这是一个形状";
}
}
// 具体形状:矩形
class Rectangle : Shape
{
public double Width { get; set; }
public double Height { get; set; }
public override double CalculateArea()
{
return Width * Height;
}
public override string GetInfo()
{
return $"这是一个矩形,宽为{Width},高为{Height}";
}
}
// 具体形状:圆形
class Circle : Shape
{
public double Radius { get; set; }
public override double CalculateArea()
{
return Math.PI * Radius * Radius;
}
}
在这个例子中,Shape
是一个抽象类,它包含了一个抽象方法CalculateArea()
和一个虚方法GetInfo()
。
Rectangle
和Circle
是具体的形状类,它们继承自Shape
。它们都必须实现抽象方法CalculateArea()
,但可以选择是否重写虚方法GetInfo()
。在这里,Rectangle
重写了GetInfo()
,而Circle
没有重写,将使用Shape
的默认实现。
总的来说,抽象方法强制派生类提供实现,适用于所有派生类都必须实现的情况;而虚方法提供了一个可选的重写机会,适用于派生类可能需要不同实现的情况。在设计类层次时,我们可以根据实际需求选择使用抽象方法还是虚方法。
抽象方法(Abstract Method)的使用场景
定义统一的接口:当你想为派生类提供统一的接口,确保所有派生类都实现某些必要的方法时,可以使用抽象方法。
强制派生类实现:当某个方法在基类中没有默认实现,而且所有派生类都必须提供自己的实现时,可以使用抽象方法。
游戏开发中的应用
游戏角色的行为: 定义一个抽象的
Character
类,包含Move()
、Attack()
等抽象方法,所有具体的游戏角色(如战士、法师等)都必须实现这些方法。游戏场景的更新: 定义一个抽象的
Scene
类,包含Update()
抽象方法,所有具体的游戏场景(如主菜单、游戏关卡等)都必须实现自己的更新逻辑。
虚方法(Virtual Method)的使用场景
提供默认实现:当你想在基类中提供一个方法的默认实现,同时允许派生类选择性地重写这个方法时,可以使用虚方法。
允许派生类扩展:当你想允许派生类基于基类的实现进行扩展或修改时,可以使用虚方法。
游戏开发中的应用
游戏物品的使用: 定义一个虚方法
Use()
,在基类Item
中提供默认实现(如打印"使用物品"),具体的物品类(如HealthPotion
、ManaPotion
等)可以选择重写Use()
方法,提供自己的实现。游戏敌人的AI: 定义一个虚方法
UpdateAI()
,在基类Enemy
中提供默认的AI行为,具体的敌人类(如Goblin
、Dragon
等)可以重写UpdateAI()
方法,实现自己的AI逻辑。
练习题目
基础题目
设计一个
Vehicle
类,包含Drive()
抽象方法,以及Car
和Boat
两个派生类,实现它们的Drive()
方法。设计一个
Shape
类,包含Draw()
虚方法,提供默认实现(如打印"绘制形状"),以及Circle
和Rectangle
两个派生类,选择性地重写Draw()
方法。
进阶题目
设计一个RPG游戏的角色系统,包含
Character
基类,以及Warrior
、Mage
、Archer
等派生类,实现它们的属性(如力量、智力、敏捷等)和方法(如攻击、使用技能等)。设计一个策略游戏的建筑系统,包含
Building
基类,以及Barracks
(兵营)、Factory
(工厂)、ResearchLab
(研究所)等派生类,实现它们的方法(如生产单位、升级科技等)。