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

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

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

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

编译时的多态:是通过重载来实现的。重载,即方法名称相同,而参数的类型不同,或者参数的个数不同。最典型的重载是我们常用的“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. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  2. .NET Core系列 :4 测试

    2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...

  3. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

    .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...

  4. ABP文档 - 异常处理

    文档目录 本节内容: 简介 启用错误处理 非AJAX请求 显示异常 UserFriendlyException Error 模型 AJAX 请求 异常事件 简介 这个文档针对Asp.net Mvc和W ...

  5. HTML块级元素

    前面的话   在HTML5出现之前,人们一般把元素分为块级.内联和内联块元素.本文将详细介绍HTML块级元素 h   标题(Heading)元素有六个不同的级别,<h1>是最高级的,而&l ...

  6. javascript匹配各种括号书写是否正确

    今天在codewars上做了一道题,如下 看上去就是验证三种括号各种嵌套是否正确书写,本来一头雾水,一种括号很容易判断, 但是三种怎么判断! 本人只是个前端菜鸟,,不会什么高深的正则之类的. 于是,在 ...

  7. .net 分布式架构之分布式缓存中间件

    开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件  方便实现缓存的分布式,集群, ...

  8. Linux之搭建自己的根文件系统

    Hi!大家好,我是CrazyCatJack.又和大家见面了.今天给大家带来的是构建Linux下的根文件系统.希望大家看过之后都能构建出符合自己需求的根文件系统^_^ 1.内容概述 1.构造过程 今天给 ...

  9. 接口--interface

    “interface”(接口)关键字使抽象的概念更深入了一层.我们可将其想象为一个“纯”抽象类.它允许创建者规定一个类的基本形式:方法名.自变量列表以及返回类型,但不规定方法主体.接口也包含了基本数据 ...

  10. Flexible 弹性盒子模型之CSS flex-flow

    实例 让弹性盒的元素以相反的顺序显示,且在必要的时候进行拆行: display:flex; flex-flow:row-reverse wrap;   效果预览 浏览器支持 表格中的数字表示支持该属性 ...