OneBigLoser
OneBigLoser
发布于 2024-07-07 / 7 阅读
0
0

多态 抽象方法和虚方法

  1. 声明方式

    • 抽象方法:使用abstract关键字声明,没有具体实现。

    • 虚方法:使用virtual关键字声明,可以有默认实现。

  2. 实现要求

    • 抽象方法:派生类必须实现所有的抽象方法,否则派生类也必须声明为抽象类。

    • 虚方法:派生类可以选择是否重写虚方法,如果不重写,则默认使用基类的实现。

  3. 所在类的要求

    • 抽象方法:只能在抽象类中声明。

    • 虚方法:可以在普通类和抽象类中声明。

  4. 调用方式

    • 抽象方法:不能直接调用,必须通过派生类的实现来调用。

    • 虚方法:可以直接调用,如果派生类重写了虚方法,则调用派生类的实现;否则,调用基类的实现。

下面是一个简单的示例代码,展示了抽象方法和虚方法的区别:

// 抽象类:形状
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()

RectangleCircle是具体的形状类,它们继承自Shape。它们都必须实现抽象方法CalculateArea(),但可以选择是否重写虚方法GetInfo()。在这里,Rectangle重写了GetInfo(),而Circle没有重写,将使用Shape的默认实现。

总的来说,抽象方法强制派生类提供实现,适用于所有派生类都必须实现的情况;而虚方法提供了一个可选的重写机会,适用于派生类可能需要不同实现的情况。在设计类层次时,我们可以根据实际需求选择使用抽象方法还是虚方法。

抽象方法(Abstract Method)的使用场景

  1. 定义统一的接口:当你想为派生类提供统一的接口,确保所有派生类都实现某些必要的方法时,可以使用抽象方法。

  2. 强制派生类实现:当某个方法在基类中没有默认实现,而且所有派生类都必须提供自己的实现时,可以使用抽象方法。

游戏开发中的应用

  • 游戏角色的行为: 定义一个抽象的Character类,包含Move()Attack()等抽象方法,所有具体的游戏角色(如战士、法师等)都必须实现这些方法。

  • 游戏场景的更新: 定义一个抽象的Scene类,包含Update()抽象方法,所有具体的游戏场景(如主菜单、游戏关卡等)都必须实现自己的更新逻辑。

虚方法(Virtual Method)的使用场景

  1. 提供默认实现:当你想在基类中提供一个方法的默认实现,同时允许派生类选择性地重写这个方法时,可以使用虚方法。

  2. 允许派生类扩展:当你想允许派生类基于基类的实现进行扩展或修改时,可以使用虚方法。

游戏开发中的应用

  • 游戏物品的使用: 定义一个虚方法Use(),在基类Item中提供默认实现(如打印"使用物品"),具体的物品类(如HealthPotionManaPotion等)可以选择重写Use()方法,提供自己的实现。

  • 游戏敌人的AI: 定义一个虚方法UpdateAI(),在基类Enemy中提供默认的AI行为,具体的敌人类(如GoblinDragon等)可以重写UpdateAI()方法,实现自己的AI逻辑。

练习题目

基础题目

  1. 设计一个Vehicle类,包含Drive()抽象方法,以及CarBoat两个派生类,实现它们的Drive()方法。

  2. 设计一个Shape类,包含Draw()虚方法,提供默认实现(如打印"绘制形状"),以及CircleRectangle两个派生类,选择性地重写Draw()方法。

进阶题目

  1. 设计一个RPG游戏的角色系统,包含Character基类,以及WarriorMageArcher等派生类,实现它们的属性(如力量、智力、敏捷等)和方法(如攻击、使用技能等)。

  2. 设计一个策略游戏的建筑系统,包含Building基类,以及Barracks(兵营)、Factory(工厂)、ResearchLab(研究所)等派生类,实现它们的方法(如生产单位、升级科技等)。


评论