多态性(C#)

      在面向对象编程中继承性和多态性是重要机制,前面我为大家分享了我对“类的继承”的理解,哪么今天我就跟大家分享下我对“多态性(C#)”的理解。

      首先我们先来看看多态的定义,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

      C#中多态分为两种形式,一种是编译的多态,一种是运行的多态;而所涉及到多态的有重载、重写、虚方法、抽象方法和隐藏方法。

      下面来看看这一段代码,我们从代码中来分析他们的概念及区别:

   public abstract class A

  {

         public abstract void prind();

  }

  public class B:A

      {

           public override void prind()

            {

                  Console.WriteLine("我是B类,我重写了A类的抽象方法prind()");

            }

            public virtual void Bprind()

            {

                   Console.WriteLine("我是B类中的虚方法,我可以被继承B类的派生类重写");

            }

            public void Nprind()

            {

                  Console.WriteLine("Nprind");

            }

   }

   public class C:B

   {

         public override Bprind()

         {

              Console.WriteLine("我重写了B类的虚方法Bprind");

         }

          new  public void Nprind()

          {

                Console.WriteLine("我是隐藏Nprind");

          }

         /* 下面是另一种隐藏方法的表现形式

          public new void Nprind()

          {

                Console.WriteLine("我是隐藏Nprind");

          }

         */

          public void Cprind()

         {

               Console.WriteLine("我是Cprind方法");

         }

         public void Cprind(string str)

         {

               Console.WriteLine(str+"我被重载了");

         }

    }

    class D

    {

         static void Main(string []arge)

         {  

              B b=new B();

              B bc=new C();

              C c=new C();

             //重写抽象方法

              b.prind();

             //重写虚方法

              b.Bprind();

              bc.Bprind();

             //隐藏方法

              b.Nprind();

              bc.Nprind();

              c.Nprind();

             //重载

              bc.Cprind();

              bc.Cprind("E");

              Console.Read();

         }

    }

输出结果:

我是B类,我重写了A类的抽象方法prind()

我是B类中的虚方法,我可以被继承B类的派生类重写

我重写了B类的虚方法Bprind

Nprind

Nprind

我是隐藏Nprind

我是Cprind方法

E我被重载了

如果单看这段代码可能会看的很费力,所以我们来听听类他们之间的对话。

D:A类因为你是抽象类,所以你可以定义抽象方法,定义的抽象方法prind可以被继承你的子类重写;因此B类可以重写你的抽象方法prind。

A:我可以被继承我的子类B重写,哪么我也可以被其他的子类重写咯,也就是说我使用了多态性。

D:是的你使用了多态性中涉及的抽象方法,因为你的所有子类都可以对你的抽象方法重写,所以你符合了多态性的定义;但你的所有子类都要注意,重写你的抽象方法必须要用到override关键字、修饰符要相同、传递的参数个数和类型也都要一样及方法的返回值都要一样。

 

D:B类你自身的Bprind方法是虚方法也可以被继承你的子类重写,不过你和A类不同的是,你自身也可以调用这个虚方法。

B:为什么Bprind会是虚方法呢?它和别的方法也没什么不同啊,只是多了个virtual关键字而已,难道加了virtual关键字的就是虚方法?

D:对的,虚方法就是必须要加上virtual关键字,而没有加virtual或别的关键字的我们叫它为非虚方法;也是因为是虚方法才可以重写,非虚方法是不能重写的;但要注意只有继承你的子类才可以重写你的虚方法。

B:哦,所以C类可以重写我的Bprind这个虚方法。

 

D:C类你不但重写了父类B的虚方法,还把B类中的Nprind方法写在了隐藏方法了,而已还对自身的Cprind方法进行了重载。

C:听到你跟A、B类的对话我知道了我是重写了虚方法,但这个隐藏方法和重载了Cprind方法,又是什么回事呢?

D:隐藏方法和重写方法差不多,只是关键字不是override,而改成了new;还有不同的是new可以在修饰符前或后。而重载是在同一个作用域中使用了相同的方法名,修饰符、返回值、参数都可以不相同。

C:隐藏方法我自己能调用吧,但如果实例化父类时引用的是我,哪么调用的应该是我的还是父类的方法呢?

D:隐藏方法你自己可以,但只有是对你自己实例时调用的才是你,而如果父类实例时引用的是你,哪么调用的将是父类的方法。

 

      首先我们先从他们对话和给合代码来看看,重载与重写的区别:

                                            重载:                                                 重写:

             修饰符                    可以不同                                              必须相同                       

       参数个数及类型               可以不同                                              必须相同

            返回值                     可以不同                                              必须相同

            方法名                     必须相同                                              必须相同

 

      接下来我们来看看抽象方法、隐藏方法、虚方法的注意事项:

       抽象方法:

       1.在基类中定义,派生类中重写。

       2.抽象方法只有在抽象类中才可使用。

       3.抽象类不能实例化。

       4.必须使用abstract。

       隐藏方法:

       1.派生类中定义的和基类中的某个方法名相同。

       2.父类调用父类的方法,而子类调用子类的方法。

       3.使用new关键字,虚方法也能使用。

        虚方法:

        1.在父类中定义的,子类可以重写。

        2.使用virtual关键字。

        注:父类自身也可调用。

 

转载于:https://www.cnblogs.com/ljhboke/p/5047011.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

孙叫兽重磅推荐Chrome插件——CSDN浏览器助手

导读:解决你在浏览器上遇到的各种问题,无论你是学生小白、还是职场老鸟,都可以借助这个插件,打造个性化浏览器,提升工作学习效率。 此插件经过多轮迭代,体积小,内存占用少,便于开发者快速安装和使用。 官方地址:https://plugin.csdn.net/ 目录 安装方法:

mysql concat 引号_在MySQL concat里面使用多个单引号,三引号的问题

在动态拼接字符串时,我们常会用到字符拼接,我对拼接的引号不理解,如:1、 id 为什么是3个引号,为什么左边一个加号右边一个加号(能不能着重帮我解释下这个,详细点)SQL codesum(case Leave when id then D…

【APICloud系列|21】使用APICloud敏捷式开发总结,回顾开发一个完整APP过程。

导读:APICloud是柚子(北京)科技有限公司创建的低代码开发平台,总部位于北京, 通过生产力工具与混合开发技术,为企业与开发者构建高效的IT环境;在APICloud平台已有80万注册用户,平台每日生成安装包超6000个。业务团队延伸至上海、深圳、重庆、青岛等10余个城市。 APICloud是…

mysql 存储过程 记录是否存在_如何检查MySQL中是否存在存储过程?

让我们首先创建一个存储过程-mysql> DELIMITER //mysql> CREATE PROCEDURE ExtenddatesWithMonthdemo(IN date1 datetime, IN NumberOfMonth int )-> BEGIN-> SELECT DATE_ADD(date1,INTERVAL NumberOfMonth MONTH) AS ExtendDate;-> END;-> //mysql> DEL…

[ExtJS5学习笔记]第三十五条 sencha extjs 5 组件查询方法

一UI前部组件势必更加,我们通常习惯性使用ID获取部件操作的需要。但是,这种方法是extjs推荐么?你有吗extjs利用它来获取组件的推荐方法? 夹 文件夹extjs的查询组件的API查询实例主要的组件查询组件树查询通过组件的属性检索属性匹…

数据湖 多维数据集_按汇总分组/多维数据集

数据湖 多维数据集时不时地,您会遇到一个使您达到SQL限制的要求。 我们中的许多人可能会早早放弃并使用Java / [或您的语言]计算内容。 相反,使用SQL可能是如此简单快捷。 如果您使用的是高级数据库,例如DB2 , Oracle &#xff0c…

【APICloud系列|22】 videoPlayer模块(视频播放)的实现

导读:videoPlayer 封装了视频播放功能(不支持音频播放)。可快进、快退设置播放位置等操作,亦可设置屏幕亮度和系统声音大小。通过监听接口可获取模块上的各种手势操作事件。 模块详情:http://www.apicloud.com/mod_detail/35792 index.html <html><head>&l…

mysql数据库突然连不上了_mysql数据库突然连接不上去

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

FlexyPool如何同时支持连接代理和装饰器

代理人 FlexyPool监视连接池使用情况&#xff0c;因此需要拦截连接关闭方法调用。 为了简单起见&#xff0c;第一个版本为此目的依赖动态代理&#xff1a; private static class ConnectionInvocationHandler implements InvocationHandler {public static final String CLOS…

集合视图控制器(CollectionViewController) 、 标签控制器(TabBarController) 、 高级控件介绍...

1 创建集合视图&#xff0c;设置相关属性以满足要求 1.1 问题 集合视图控制器UIConllectionViewController是一个展示大量数据的控制器&#xff0c;系统默认管理着一个集合视图UICollectionView&#xff0c;功能几乎和UITableViewController差不多&#xff0c;能够以多行多列的…

【APICloud系列|23】 UIPullRefresh 模块(下拉刷新)的实现

导读:UIPullRefresh 模块对引擎新推出的下拉刷新接口进行了一层封装,App 可以通过此模块来实现带炫酷动画效果的下拉刷新功能。 使用了 window + frame 的布局,如果你只是使用在独立的 window 布局,那么就需要在 config.xml 中配置 <preference name="customRefres…

mysql迭代查询并分页_mysql 数据库 分页查询优化

举个栗子&#xff1a;表名&#xff1a;batch_big_num列名&#xff1a;id(主键)&#xff0c;name&#xff0c;age&#xff0c;product_name&#xff0c;product_num1&#xff0c;利用索引(1)加一个order by索引列 可以提升一定的效率select * from batch_big_num order by id …

【APICloud系列|24】 MNNavigationMenu模块(导航菜单)的实现

导读:MNNavigationMenu 是一个导航栏菜单,开发者可自定义其中的样式和按钮个数,超出屏幕部分可左右拖动查看。 模块详情:http://www.apicloud.com/mod_detail/12417 index.html <!doctype html> <html> <head><meta charset="utf-8">&…

mysql2教程_mySQL 教程 第2章 安装和介绍mySQL

设置mySQL字符集支持中文的字符集是utf8&#xff0c;该设置可以更改mySQL配置文件进行全局设置&#xff0c;也可以针对数据库设置&#xff0c;也可以针对表设置&#xff0c;也可以针对列设置。字符集更改后新插入的数据生效&#xff0c;对以前不生效。练习1&#xff1a;更改MyS…

java 更新订单状态_Java 8状态更新

java 更新订单状态即将到来的Java SE 8发行版的两大新语言功能是Lambda Expressions和Modularity。 这两天的状态更新都已经发布。 我会与您分享链接&#xff0c;因此您可能会在假期中通读它们 Oracle计划在2013年中期发布Java SE 8。 Lambda项目 Lambda项目以及JSR-335希望提…

有沃更精彩,沃课堂理想的移动学习平台

有沃更精彩。沃课堂&#xff0c;能够让你随时随地在你的手机上学习。在ipad上学习视频课程&#xff0c;能够在你闲暇时、等车时拿出你的pad,拿出你的手机来学习复习一段时间。让学习不在局限于互联网&#xff0c;局限于课堂上。 沃课堂。採用的是云server&#xff0c;全部的信息…

【APICloud系列|25】 easeChat模块(环信-即时通讯)的实现

导读&#xff1a;easeChat 模块封装了环信即时通讯云的开放SDK,封装的接口都是纯功能类接口&#xff0c; 主要分三大类&#xff1a; 1&#xff0c;注册、登录、退出、监听 2&#xff0c;创建群组、添加/删除好友、获取好友列表 3&#xff0c;消息、会话、聊天 功能详情参考模块…

mysql dump 10.13_mysqldump版本引起的问题

mysqldump5.1版本mysqldump --versionmysqldump Ver 10.13 Distrib 5.1.73, for redhat-linux-gnu (x86_64)mysqldump --help | grep gtid没有内容mysql5.6版本mysqldump --versionmysqldump Ver 10.13 Distrib 5.6.25, for Linux (x86_64)mysqldump --help | grep gtid--set…

基于JBoss Fuse 6.2的JBoss BPM微服务集成指南

今年年初&#xff0c;我们宣布了JBoss BPM Suite令人兴奋的示例项目&#xff0c;该项目围绕一个正在运行的在线Travel Agency项目展开。 最初是利用Web服务&#xff0c;后来我们在JBoss Fuse的帮助下迁移到微服务 。 随着JBoss Fuse 6.2的发布&#xff0c;我们希望重新访问该…

【APICloud系列|26】UIScrollPicture 模块(图片轮播)的实现

导读:UIScrollPicture 模块是一个图片轮播模块,只需传入一组图片地址,即可实现图片轮播效果。同时演示了如何使用UIScrollPicture实现APP引导页功能 使用模块前需在控制台添加UIScrollPicture模块和UIButton模块。 使用UIScrollPicture创建引导页方法1:点击引导页最后一个页…