javaee论坛

普通会员

225648

帖子

335

回复

349

积分

楼主
发表于 2019-11-04 09:16:43 | 查看: 94 | 回复: 2

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

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

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

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

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

publicabstractclassBall{//获取球类的名称publicabstractstringGetName{get;}//打球publicabstractvoidPlay();}

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

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

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

//足球类publicclassFootBall:Ball{publicoverridestringGetName{get{return"足球";}}publicoverridevoidPlay(){Debug.Log("鸣人正在踢足球");}}//篮球类publicclassBasketBall:Ball{publicoverridestringGetName{get{return"篮球";}}publicoverridevoidPlay(){Debug.Log("佐助正在打篮球");}}

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

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

publicclassTest:MonoBehaviour{publicvoidPlayBall(Ballball){print("这是"+ball.GetName);ball.Play();}}

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

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

voidStart(){//实例化FootBallfootBall=newFootBall();BasketBallbasketBall=newBasketBall();//足球实例当PlayBall方法的参数PlayBall(footBall);//篮球实例当PlayBall方法的参数PlayBall(basketBall);}

启动u3d,打印结果如下Perfect!

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

结束语如果这篇博客有幸帮到了您,欢迎点击下方链接,和更多志同道合的伙伴一起交流,一起进步。


普通会员

0

帖子

307

回复

316

积分
沙发
发表于 2019-11-07 14:32:24

标记一下

普通会员

0

帖子

327

回复

331

积分
板凳
发表于 2024-03-27 23:20:47

围观

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017