前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历。过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用。结果这位作者竟然说这么基础的问题还真不记得了,于是,面试失败。

其实多态,是个很基础的,也非常重要的概念,作为程序开发者,这些基础的概念必须非常牢固,在开发的过程中,才能得心应手。

同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。举个通俗的例子:摩托车和汽车都是车子的派生类,如果我在另一个类中需要调用车子的刹车方法,那么我只需要把车子的对象传参数进去,然后调用“刹车()”方法即可。而摩托车和汽车的刹车的方法实现不同,虽然都叫“刹车”,但一个是手抓,一个是脚踩。但我们调用的时候不需要知道具体的实现,只管根据名称调用即可,具体则根据示例的不同,而有不同的刹车方法的实现。

多态分为两种:编译时的多态,和运行时的多态

编译时的多态:是通过重载来实现的。重载,即方法名称相同,而参数的类型不同,或者参数的个数不同。最典型的重载是我们常用的“message”类下面的方法“show()”,一个参数代表弹出的信息内容,第二个参数代表弹窗标题,等等。

运行时的多态:通过虚成员的方式实现。在继承关系里面,子类会继承父类所有的属性,方法,事件。那么如果子类需要更改某个方法(通俗的讲,可以理解为子类需要一个和父类中同名的方法,但不同的实现),有两种方法。而这两种方法的区别,非常重要。

  1. 使用New关键字。当子类中使用New关键字来覆盖父类中的同名方法时,父类的成员则被隐藏了,称为“隐藏成员”。
  2. 基类中将成员声明为虚成员。在基类成员的返回类型之前加关键字“virtual ”即可声明为虚拟成员。派生类,可以对虚拟成员进行重写,重写加关键字“override ”即可。同样可以实现替换基类的老成员。

那么,这两种方式有什么不同呢?

如果使用New来覆盖基类成员的时候,当派生类实例被转换为基类型使用的时候,调用的成员会是被New隐藏掉的隐藏成员,是旧的。而如果是通过虚成员重写的方式,那么调用的,会是被派生类重写之后的新成员。

明白了么?如果分不清楚,可以这样记:New覆盖,只是用新的换了旧的,旧的还是存在,重写,是把父类的也重新给写了。

明白这个区别之后,什么时候该怎么用,也明白了吧。

C#非常重要基础之多态的更多相关文章

  1. Java基础十一--多态

    Java基础十一--多态 一.多态定义 简单说:就是一个对象对应着不同类型. 多态在代码中的体现: 父类或者接口的引用指向其子类的对象. /* 对象的多态性. class 动物 {} class 猫 ...

  2. 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)

    五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...

  3. Java基础之多态和泛型浅析

    Java基础之多态和泛型浅析 一.前言: 楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结 二.什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面 ...

  4. 30天C#基础巩固-----多态,工厂模式

         自己要有自信,相信自己可以找到好的工作.面对校招,企业更加看重自己的基础,这30天就把C#的基础好好的复习,学习下.笔记一定要认真的记录,这样自己复习回顾的时候就有了可以参考的东西了. 一: ...

  5. Objective-C基础之──多态

    Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性.继承性和多态性. 今天介绍一下Objective-C中的多态性. 一.什么是多态 多态:不同对 ...

  6. Python基础之多态与多态性

    切记:不要将多态与多态性这二者混为一谈,只要分开,就会很明朗了. 一.多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承). 比如:动物分为人类.狗类.猪类(在定义角 ...

  7. iOS开发Objective-C基础之──多态

    Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性.继承性和多态性. 今天介绍一下Objective-C中的多态性. 一.什么是多态 多态:不同对 ...

  8. 【Java基础】多态

    首先先来个总结: 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消 ...

  9. java基础之 多态

    在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言 ...

随机推荐

  1. CoreCLR源码探索(一) Object是什么

    .Net程序员们每天都在和Object在打交道 如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" 这个答案是对的 ...

  2. Angular2入门系列教程3-多个组件,主从关系

    上一篇 Angular2项目初体验-编写自己的第一个组件 好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系 现在,假设我们要做 ...

  3. python黑魔法 -- 内置方法使用

    很多pythonic的代码都会用到内置方法,根据自己的经验,罗列一下自己知道的内置方法. __getitem__ __setitem__ __delitem__ 这三个方法是字典类的内置方法,分别对应 ...

  4. jQuery学习之路(5)- 简单的表单应用

    ▓▓▓▓▓▓ 大致介绍 接下来的这几个博客是对前面所学知识的一个简单的应用,来加深理解 ▓▓▓▓▓▓ 单行文本框 只介绍一个简单的样式:获取和失去焦点改变样式 基本结构: <form actio ...

  5. kafka配置与使用实例

    kafka作为消息队列,在与netty.多线程配合使用时,可以达到高效的消息队列

  6. maven依赖查询地址

    http://search.maven.org/#search%7Cga%7C1%7C

  7. js 入门级常见问题

    写在前面:以下是个人总结的关于js常见的入门级的问题一些总结. js是有 ECMAScript Dom Bom 三部分组成. 1,undefined,NaN,Null,infinity 1) unde ...

  8. 使用DeviceOne实现微信小程序功能

    微信小程序即将推出,还没推出就火的不行了.基于微信这个巨大平台,小程序必然能有巨大成功.不过它并不能完全取代App,该开发App还得开发.如果我们自己想实现一个基于自己的APP包含类似微信的小程序功能 ...

  9. 【centos7常用技巧】RPM打包

    一.RPM打包的目的 1.当目标机中不存在编译环境时,可以先在本地环境中编译打包,然后直接在目标机中用rpm -ivh *.rpm安装即可. 2.当需要在目标机中安装多个软件或者增加多个文件时,可以将 ...

  10. Android—ListView条目背景为图片时,条目间距问题解决

    ListView是android开发中使用最普遍的控件了,可有的listView条目的内容颇为丰富,甚至为了美观,背景用指定图片,如下图: