当前位置: 首页 > article >正文

C#核心(18)面向对象多态vob

前言

我们在先前已经完成封装和继承的知识点,已经掌握了三分之二的核心知识点,那么最后一块,多态,也是相当重要,在实际开发中使用比较多的东西。

在学习继承的时候,不知道你会不会有这么一个想法,当我和我的兄弟都有父类的同一个方法但是其中略有不同的时候,我们应该怎么办?是在子类里重新开一个函数吗?这显然不科学。

于是语言设计者为我们提供了更好的方法,就是多态的设计。

概念

让继承同种父类的子类们,在执行相同方法行为有不同的表现。

打个比方,我这里有一个人物基础的父类,继承他的有敌人和npc两个子类。

其中父类有一个方法叫做巡逻,这点不难理解吧。

npc和敌人都要巡逻,但是很明显,npc巡逻只是固定路线来回移动,偶尔说两句话,但敌人就不一样了,他看到玩家会进入追击或者什么的。

那么这时候多态就可以帮助我们在两个子类中分别实现巡逻的方法。

多态的实现

  • 编译时的多态:函数重载
  • 运行时的多态(vob,抽象函数,接口)

vob的解释

v:virtual(虚函数)——>可以被子类重写

o:  override(重写)——>重写虚函数

b:base(父类)——>保留父类行为 base.函数名

实例

我们定义了一个基类GameCharacter,其中包含一个virtual方法Attack()。然后我们创建了一个子类PlayerCharacterEnemyCharacter,其中PlayerCharacter类通过override关键字重写了基类的Attack()方法,并在方法内部调用了基类的Attack方法,而EnemyCharacter类未重写Attack()方法,因此将使用基类的实现。

Game类的Main方法中,我们创建了一个PlayerCharacter对象和一个EnemyCharacter对象,并分别调用它们的Attack()方法。从输出结果可以看到,PlayerCharacterAttack()方法先输出了"玩家攻击",然后调用了基类的Attack()方法,而EnemyCharacter只调用了基类的Attack()方法。

using System;

public class GameCharacter
{
    public virtual void Attack()
    {
        Console.WriteLine("基础攻击");
    }
}

public class PlayerCharacter : GameCharacter
{
    public override void Attack()
    {
        Console.WriteLine("玩家攻击");
        base.Attack(); // 调用基类的Attack方法
    }
}

public class EnemyCharacter : GameCharacter
{
    // EnemyCharacter类未重写Attack方法,将使用基类的实现
}

public class Game
{
    public static void Main(string[] args)
    {
        GameCharacter player = new PlayerCharacter();
        player.Attack();

        Console.WriteLine();

        GameCharacter enemy = new EnemyCharacter();
        enemy.Attack();
    }
}

总结

今天我们简单了解了vob及其使用,也明白了大概使用的场景,希望对你日后的游戏编程有所帮助。当然前面的知识也很重要,希望你在学习中也要学会总结回顾。

如果你有什么忘记的,建议重新回去翻翻,这些东西都是基础中的基础,希望你能牢牢掌握。

还是那句话,学习路上,脚踏实地。

请期待我的下一篇博客!

我来自佑梦游戏开发,感谢你的关注和收藏!

 


http://www.kler.cn/a/443975.html

相关文章:

  • vulnhub靶场【WhowWantsToBeKing】之1
  • img向后端获取图片时怎么解决需携带token的问题
  • VLM--CLIP作分类任务的损失函数
  • STM32F103 | Embedded IDE03 - 使用OpenOCD在STM32F103项目时出现下载固件失败
  • node express服务器配置orm框架sequilize
  • Java实现贪吃蛇游戏
  • LabVIEW中的“Synchronize with Other Application Instances“
  • uniapp blob格式转换为video .mp4文件使用ffmpeg工具
  • DePIN潜力项目Spheron解读:激活闲置硬件,赋能Web3与AI
  • rust使用log与env_logger两个crate实现同时向控制台和文件输出日志。并在隔日自动创建新日志文件。
  • IEC 101/104 中为什么我们需要单点和双点信号
  • 01、NodeJS学习笔记,第一节:Node.js初识与内置模块
  • 如果 MySQL 的自增 ID 用完了,怎么解决?
  • C语言学习day24:DLL函数导出详情
  • leetcode 881.救生艇
  • R语言的字符串操作
  • APO v1.1.0 更新:大模型根因分析支持深入分析;优化数据筛选功能;内置 NGINX 日志分析看板
  • 小米自研系统Vela全面开源:开启物联网新时代的技术革新之旅
  • 【Yonghong 企业日常问题04】永洪BI可视化工具Linux部署全攻略(部署详解版)
  • 探索 Seaborn Palette 的奥秘:为数据可视化增色添彩
  • sqlserver新建用户并分配对视图的只读权限
  • 面试小札:Java后端闪电五连鞭_8
  • Oracle 数据库中,UNION ALL创建视图的使用详解
  • 【MySQL】InnoDB存储引擎中的页
  • 梳理你的思路(从OOP到架构设计)_浅尝架构师的滋味03
  • 【5】C#期末复习第5套