您的位置:主页 > 123kj手机看开奖 > 关于c语言问题为什么它创建实例是 tiyuxm[0] = new yumaoqiu();

关于c语言问题为什么它创建实例是 tiyuxm[0] = new yumaoqiu();

发布日期:2019-10-19 18:58   来源:未知   阅读:

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  展开全部这里面有一个重要的原则你不知道而已——里氏代换原则(LSK)。里氏代换指的是用父类来代换子类,使用时可以隐转(隐式转换,父类代替子类时)和强转(显式转换,父类还原子类时)。

  说白了,就是基类(父类)可以用来代替子类,而面向抽象编程或面向接口编程都必须通过这个特点来实现的。

  一个基类(普通类/抽象类/纯抽象类/接口)都可以在运行时来用指向内存中的子类。比如你的tiyuxm就是基类,至于这个基类是普通类还是抽象类还是接口,在这里都没有要求。而yumaoqiu是继承于tiyuxm的。正常使用时,我们可以使用yumaoqiu x = new yumaoqiu();这样是没有任何问题的,由于里氏代替,那么tiyuxm x1 = (tiyuxm)x;这样就是里氏代换。当然了,这种写出来的显式转换但事实上可以直接使用隐式转换的;只是为了让你看清楚原理。tiyuxm x1 = x;这样才是正确的写法。当然,需要还原时会用yumaoqiu x2 = (yumaoqiu)x1;这样就必须是强转。

  这里必须有一个特别的事情要说明,虽然里氏代替的存在,但是内存中运行的中子对象,只不过是用父对象来“指示”而已。并不是说内存中是父对象。很多人都会以为里氏代换就是用父对象批示子对象,其实这里边说出了大部分的里氏功能,但其实是可以强转实现很多特色的。

  而抽象类不能实例化与里氏没有关系,它就是语言规范中的一个规则而已。里氏只是父对象来指向子对象而已。

  其实这里让你理解的就是这个功能。tiyuxm x1 = new yumaoqiu();虽然x1是用父对象表达的,但内存中实际的还是子对象yumaoqiu,所以x1.play();执行的还是yumaoqiu对象中的play()方法(当然,如果play()是个抽象方法的话)!所以这种情况下我们有时会称play()方法延迟到子类实现。

  里氏原则是面向抽象编程与面向接口编程的一个重要保障。所谓的面向对象编程五大原则与一个法则(有人称之为六大原则),其中有人称的”应该面向抽象编程而不是实现“就是这个做为保证。

  比如说,调用你的人只须要调用tiyuxm这个类(或接口)就可以了,他不须要再了解到底是yumaoqiu还是zuqiu,这样两个模块之间的联系就干净多了(所谓的低耦合就是类与类之间的联系越低或者说越松散越好)。换句话来说,调用方不会关心你的具体实现。所以他也不会关心你将来会不会增加一种新的体育项目,不管你如何变化,调用方只须要体育项目就可以了,哪怕是需求发生了变化,他并不在乎,只由实现去做应对就可以了。

  所以,调用方模块传参数传递时都会使用抽象类或接口。参数传递也是以父类为类型传递的(但实现上你传递过来的是内存中的子类指针或副本)。kj611开奖直播

  这个方法就不在乎你传递的是足球还是羽毛球了,即例你新增加了其他的体育项目,那么代码上也不会涉及到更改!在变化的需求中做到了不变。而这个编程也是面向抽象编程(tiyuxm是一个抽象类)。

  当然,由于是隐转的关系,你直接使用play(new yumaoqiu())也没有任何错误的。277cc生财有道图库香港电锯惊魂2中的那个警官不是第2部死了吗?www.3493.com

------分隔线----------------------------

铁算盘论坛 - www.678224.com - 123kj手机看开奖 - 2019年白小姐祺袍A - 100tk全年图库黑白 - 90422.com - www.886000.com -