C# 面向对象之多态

为什么使用多态?

   大部分多态建立在继承的基础上,多态是:【解决父类方法不适合子类的问题】,继承之后选择性的复用,父子中的方法名相同但是方法体可能不同,多态体现在灵活性,使得代码质量具有复用性、可维护性。

什么是多态?

   多态:多种形态,对象的多种形态,行为的多种形态(老人用手机打电话,小孩儿用手机打游戏)

  1. 对象的多种形态体现为,子类对象可以通过父类型引用,

Animal obj3 = new Dog(); (比如狗除了是狗还是动物)

    2.》行为的多态体现为方法的重写,隐藏,重载

           继承将相关概念的共性进行抽象,并提供了一种复用的方式。

          多态在共性的基础上,体现类型及行为的个性化,一个行为有多个不同的实现

多态的实现方式,有几种实现多态的方式?

  实现多态的基本方式:隐藏,重写; 

  实现多态其它方式:重载,接口

1》、方法隐藏

如果父类的方法不能重写不是virtual,abstract,override),此时可能选择方法隐藏。

定义:

调用:

      方法隐藏 :指的是技术,子类新定义一个方法,与父类方法同签名,子类型用新定义的方法隐藏掉父类继承的旧方法。

      隐藏方法:隐藏方法建议在方法前加new关键字,new可以省略但最好不要省 。

下面是利用方法隐藏计算圆、三角形、矩形的面积:

   

调用:

上面方法隐藏的缺点是只能子调子方法,不能父调子方法,但是如果想要

希望通过父调子,好处:调用端代码可以更加简洁, 声明一个变量即可!但是重写可以实现父调子。

2》、方法重写

下面是利用方法重写计算圆、三角形、矩形的面积:

调用:

方法隐藏原理 

方法隐藏是子类的方法表加入一个新项,新项中表示的方法签名与继承来的方法签名一致,但是在方法表中不能出现相同签名的方法项,所以必须要隐藏掉一个,子类用新项(开辟新的内存地址)隐藏旧项

方法重写原理 

父类的方法在子类重写后,是子类型将方法表中相应方法签名对应的方法所在的地址重写了,重写后,原方法签名项关联到新方法的地址。当引用调用该方法时,访问新地址中的方法。

所以方法重写后,不管是通过父类还是子类型的引用,调用方法时,都调用对象真实类型中定义的方法。

 

总结:隐藏和重写的比较
共性:都是多态实现的基本方式,都可以实现选择性的复用【解决父类方法不适合子类的问题】      
不同:
    1)隐藏不能实现父调子方法  父 obj=new 子()
       重写可以实现父调子 从而让代码具有更好的复用性,
                                           可维护性。
       实际开发中重写用的多
    2)实现原理不同【了解】
       隐藏 静态绑定 性能略高 灵活性差
       重写 动态绑定 性能略低 灵活性好
       如果实现同样的功能,不需要父调子,仅仅为了选择性复用,使用隐藏 性能略高!

绑定:通俗讲就是系统确定一个类型能够调用哪些方法

1静态绑定(编译时绑定):是指调用关系是在运行之确定,即编译期间

2 动态绑定(运行时绑定):是指调用关系是运行期间过程中】确定

静态绑定因为在编译期确定,不占用运行时间,所以调用速度比动态绑定要快。

动态绑定因为在运行期确定,占用运行时间,但是更灵活。动态绑定比静态绑定灵活性好速度略低

3》、方法重载

发布了122 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40229737/article/details/103996041