这是【C# 教程系列第 12 篇】,如果觉得有用的话,欢迎关注专栏。

上一篇博客讲到了 C# 中的抽象类与抽象方法,对这两个概念不清楚的可以 点击此处

通过上篇博客我们会发现,使用 abstract 关键字表示类或成员是抽象的

抽象方法因为不提供具体的实现,所以没有方法体(一对大括号所包裹的内容),语句以分号结束。
抽象类仅对成员进行声明,但不提供实现代码,就等于设计了一个“空架子”,描绘一幅大致的蓝图,具体如何实现取决于派生类。
正因为抽象类自身不提供实现,所以不能进行实例化,调用没有实现代码的实例没有实际意义。

接着我们在代码中说明如何运用抽象类及抽象方法

这里我写一个表示所有球类的基类 Ball ,并把该类设置为抽象类。
在这个抽象类里有一个可以获取球类名称的抽象访问器,以及一个打球的抽象方法,代码如下

    public abstract class Ball{//获取球类的名称public abstract string GetName { get; }//打球public abstract void Play();}

这里的 GetName 属性返回某种球类的名称,如果是足球就返回“足球”,如果是篮球就返回“篮球”。
Play 方法会根据不同的派生类提供不同的实现,如果是足球,就输出“鸣人正在踢足球”,如果是篮球,就输出“佐助正在打篮球”,

接着我写一个足球类 FootBall 和一个篮球类 BasketBall ,并分别继承 Ball 抽象类。

(平常我会用到JB公司的插件 Resharper,把鼠标放到 FootBall类 后的 Ball 类上,这里按下 Alt+Enter 组合键可以快速实现抽象类,然后对生成的代码稍作修改即可)
最终的代码如下:

 //足球类public class FootBall : Ball{public override string GetName{get { return "足球"; }}public override void Play(){Debug.Log("鸣人正在踢足球");}}//篮球类public class BasketBall : Ball{public override string GetName{get { return "篮球"; }}public override void Play(){Debug.Log("佐助正在打篮球");}}

我们会注意到,实现抽象类的抽象成员也是使用 override 关键字与前面提到的成员覆写相似,实现抽象类,也可以看做是覆写基类的成员。

接着我在继承 MonoBehaviour 类的 Test 类中,写一个 PlayBall 的方法,参数为 Ball 类型的成员。如下代码所示

    public class Test : MonoBehaviour{public void PlayBall(Ball ball){print("这是"+ball.GetName);ball.Play();}}

重头戏来了!!!
PlayBall 方法可以体现抽象类的用途,参数 ball 只声明为 Ball 类型,即定义的抽象类,这样的好处在于,不管调用方法传递进来的是什么类型的对象,只要是实现了 Ball 抽象类的类型即可。
抽象类 Ball 已经规范了派生类肯定存在的 GetName 属性和 Play 方法两个成员,很明显,这种处理方式比较灵活。

最后我在 Start 函数里分明声明足球类与篮球类的实例,并调用 PlayBall 方法,代码如下

    void Start(){//实例化FootBall footBall=new FootBall();BasketBall basketBall=new BasketBall();//足球实例当 PlayBall 方法的参数PlayBall(footBall);//篮球实例当 PlayBall 方法的参数PlayBall(basketBall);}

启动u3d,打印结果如下

Perfect!

ok, 抽象类的简单用途就介绍到这里。
各位,晚安!

你的问题得到解决了吗?欢迎在评论区留言。

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。


结束语

技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。

最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。

【C# 教程系列第 12 篇】抽象类的简单实现相关推荐

  1. 【CSS 教程系列第 12 篇】什么是 CSS 中的伪类选择器

    这是[CSS 教程系列第 12 篇],如果觉得有用的话,欢迎关注专栏. CSS 的选择器有很多,常用的有 元素选择器.id 选择器.class 选择器.后代选择器.子代选择器.并集选择器.交集选择器. ...

  2. 【Unity3D 教程系列第 12 篇】如何用Unity写一个简易的计时器工具?

    这是[Unity3D 教程系列第 12 篇],如果觉得有用的话,欢迎关注专栏. 平常关于延时的处理很多人都喜欢用携程去处理,但是在 Unity 里,并不建议大家用过多的携程,因为会出现一些莫名其妙的 ...

  3. 【HTML 教程系列第 12 篇】什么是 HTML 中的 div 标签

    这是[HTML 教程系列第 12 篇],如果觉得有用的话,欢迎关注专栏. 1:语法 <div></div> 2:作用 div 标签可以用来划分 HTML 结构,从而配合 CSS ...

  4. 【Android 教程系列第 12 篇】常用 App 的 URL Scheme

    这是[Android 教程系列第 12 篇],如果觉得有用的话,欢迎关注专栏. App 的 URL Scheme 就像网页的 url 链接一样,可以打开 App 或跳转到相应的页面. 下面是我结合 参 ...

  5. 【C# 教程系列第 11 篇】什么是抽象类、抽象方法

    这是[C# 教程系列第 11 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:什么是抽象类.抽象方法 二:抽象类的特性 1:抽象类不能实例化 2:抽象类可以包含抽象方法和抽象访问器 3:不能用 ...

  6. 【C# 教程系列第 15 篇】抽象类与接口的区别

    这是[C# 教程系列第 15 篇],如果觉得有用的话,欢迎关注专栏. 前面几篇博客介绍了抽象类与接口,提到其中一个,很容易想到另外一个,包括搜索时自动联想的内容也是两者的区别,因为抽象类和接口在使用方 ...

  7. 【Android 教程系列第 13 篇】在小米手机上使用安卓投屏软件 QtScrcpy ,为什么点击屏幕没有反应

    这是[Android 教程系列第 13 篇],如果觉得有用的话,欢迎关注专栏. 一:问题描述 众所周知,QtScrcpy 是一款非常好用的安卓投屏软件. 以前用的测试机是一加的,最近换了小米的,发现开 ...

  8. 【Dart 教程系列第 21 篇】Dart 之 firstWhere 返回数组中第一个满足条件的元素

    这是[Dart 教程系列第 21 篇],如果觉得有用的话,欢迎关注专栏. Dart 返回数组中第一个满足条件的元素,用 firstWhere() 方法,源代码定义如下 E firstWhere(boo ...

  9. 【Dart 教程系列第 22 篇】Dart 之 lastWhere 倒序查找数组中第一个满足条件的元素

    这是[Dart 教程系列第 22 篇],如果觉得有用的话,欢迎关注专栏. Dart 倒序查找数组中第一个满足条件的元素,用 lastWhere () 方法,源代码定义如下 E lastWhere(bo ...

最新文章

  1. 服务器的操作系统分哪几类,服务器的操作系统分哪几类
  2. php 做的网页 排版错误,discuz 帖子排版显示出错
  3. oracle 增加间隔分区,oracle分区表之间隔分区(oracle 11g) - 漫兮网
  4. 宽字符编码和解码通用类[CodeWidthChartUtility]
  5. PostgreSQL ALTER TABLE 命令
  6. 使用EditPlus运行C/C++
  7. 程序员也要学英语——连词、并列句和从句
  8. 台风怎么看内存颗粒_《CY》又一4000+的颗粒,三星新版D-DIE颗粒超频测试
  9. 带内网络遥测INT--In-band Network Telemetry
  10. 华三防火墙应用二层和三层的配置实例
  11. python操作word、ppt、pdf
  12. 软考中级 真题 2016年下半年 系统集成项目管理工程师 基础知识 上午试卷
  13. centos7默认字体_CentOS7安装字体库
  14. 一张图分出你是用左脑还是右脑!
  15. Hadoop大数据平台实践(二):Hadoop生态组件的学习文档
  16. 深度学习数学基础-概率与信息论
  17. IO多路复用实现方式
  18. elasticsearch-rest-high-level-client操作elasticsearch
  19. PWN入门系列教程~(1)
  20. 华为HCNP老学员分享学习的几个境界

热门文章

  1. C++ Builder 由于找不到 CC32C260MT.DLL、rtl260.bpl、vcl260.bpl,无法继续执行代码
  2. 第二期:百度AI开发者大会;蚂蚁金服投资雪球|互联网行业公会
  3. 1028 人口普查 (20分)
  4. 关于时间:UTC/GMT/xST/ xDT
  5. JS学习日记--面向对象
  6. 【Kafka】Kakfa KeeperErrorCode = AuthFailed for /consumers
  7. ffmpeg之H264
  8. 膜拜!用最少的代码却实现了最牛逼的滚动动画
  9. 十六、MDT 2013 Update 1批量部署-应用程序导入及自动安装(含OFFICE 2007安装)
  10. ArcGIS9.3的注册码