C#动态多态性是通过抽象类和虚方法实现的。

抽象类的理解

用关键字abstract创建抽象类,用于提供接口的部分类的实现(理解:接口不能提供实现,抽象类中可以有实现,接口与抽象类一起使用,可以达到父类中不能实现的子类就必须实现,父类中有实现的子类就不需要实现的目的)。抽象类包含抽象方法,抽象方法必须在派生类中实现,派生类具有更有更专业的功能。

有关抽象类的一些规则:

1、不能创建一个抽象类的实例。

2、不能在一个抽象类外包声明一个抽象方法。

3、通过在类定义前面放置关键字sealed,可以将类声明为密封类。当一个类被声明为sealed时,它不能被继承,抽象类不能被声明为sealed。

虚方法的理解

当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法,虚方法是使用关键字virtual声明的,虚方法可以在不同的继承类中有不同的实现,对虚方法的调用是在运行时发生的,动态多态性是通过抽象类和虚方法实现的。

抽象方法:

abstract方法和virtual方法的区别:

1、virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),abstract修饰的方法一定不能实现。

2、virtual可以被子类重写,而abstract必须被子类重写。

3、如果类成员被abstract修饰,则该类前必须添加abstract,因为只有抽象类才可以有抽象方法。

4、无法创建abstract类的实例,只能被子类继承,子类若不实现abstract类中的抽象方法,依然是个抽象类,不能被实例化;相反,若子类实现abstract类的抽象方法,则子类可以被实例化。

隐藏方法:隐藏方法使用new关键字定义。

虚方法和隐藏方法的区别:

虚方法的调用,调用上,使用子类构造的对象调用虚方法,就会调用子类的方法,使用父类构造的对象,就会用父类的方法。

隐藏方法的调用,调用上,使用子类类型的声明调用隐藏方法,就会调用子类的方法,若想调用被隐藏的方法,需要用父类类型的声明来调用。

调用不同举例:

class Enemy
{
    public void Move() {
     Console.WriteLine("调用了 enemy的move方法");
    }
    public virtual void Attack() {
     Console.WriteLine("enemy attac");
    }
    }     class Boss : Enemy
    {
    public override void Attack() {
     Console.WriteLine("Boss Attac");
    }     public new void Move() {
     Console.WriteLine("Boss move");
    }
} static void Main(string[] args)
{
//---- 隐藏方法的调用----begin
Boss oneEnemy = new Boss();
oneEnemy.Move(); // 调用的是隐藏方法, 用子类的声明来调用的,调用的就是子类的Move。 Enemy twoEnemy = new Boss();
twoEnemy.Move(); // 调用的隐藏方法, 用父类的声明来调用的,调用的就是父类的Move方法。
//-----------------------end //-----虚方法的调用----- begin
用什么类型 来构造,在调用方法的时候就会调用什么类型的方法。 Enemy threeEnemy = new Enemy();
threeEnemy.Attac(); // 调用虚方法,用父类来实例化的,所以调用的是父类的Attac方法。 Enemy fourEnemy = new Boss();
fourEnemy.Attac(); // 调用虚方法,用子类来实例化的,所以调用的就是子类(Boss)的Attac方法。 //-----虚方法的调用------end Console.ReadKey();
}

C#动态多态性的理解的更多相关文章

  1. C++学习之路—多态性与虚函数(一)利用虚函数实现动态多态性

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多态性是面向对象程序设计的一个重要特征.顾名思义 ...

  2. JDK动态代理深入理解分析并手写简易JDK动态代理(下)

    原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-01-05/27.html 作者:夜月归途 出处:http://www.guitu ...

  3. JDK动态代理深入理解分析并手写简易JDK动态代理(上)

    原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-01-03/27.html 作者:夜月归途 出处:http://www.guitu ...

  4. c#静态多态性与动态多态性

    C# 多态性 多态性意味着有多重形式.在面向对象编程范式中,多态性往往表现为"一个接口,多个功能". 多态性可以是静态的或动态的.在静态多态性中,函数的响应是在编译时发生的.在动态 ...

  5. python中对多态和多态性的理解

    python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多态的概念依赖于继承) import abc class Animal( ...

  6. Java(Android)编程思想笔记01:多态性的理解

    1. 多态的定义: 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式. (发送消息就是函数调用)   2. 多态的理解    多态是面向对象的重要特性,简 ...

  7. 对JAVA动态代理的理解

    叫动态代理就代表着有“静态代理”这回事. 而且,通常“动态”至少听着更NB一点. 关键就在于不明白啥叫“动”,这个得跟“静”比较下. 在我的理解,静态代理得自己声明一个类,实现跟被代理对象同样的接口. ...

  8. C++多态性的理解

    本文章转载来自:http://www.sollyu.com/?p=627 代码 #include <iostream.h> class Animal { public: void eat( ...

  9. JavaScript 词法、静态、动态作用域初级理解

    开始之前 由于本人也是JavaScript初学者,记录学习经过,怕以后会忘记. 对于JavaScript 初学者来说,最难的不是代码部分,而是对很多书籍中的术语的理解,大多时候想要理解一段JavaSc ...

随机推荐

  1. Windows系统调用中的现场保存

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中的现场保存 我们之前介绍过三环进零环的步骤 ...

  2. .net工作流引擎ccflow开发平台属性功能的隐藏显示介绍

    关键字: 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 表单引擎 工作流功能说明  工作流设计 工作流快速开发平台   业务流程管理   bpm工作流系统  java工 ...

  3. 爬虫1:html页面+beautifulsoap模块+get方式+demo

    前言:最近公司要求编写一个爬虫,需要完善后续金融项目的数据,由于工作隐私,就不付被爬的网址url了,下面总结下spider的工作原理. 语言:python:工具:jupyter:    概要:说到爬虫 ...

  4. [Luogu3659][USACO17FEB]Why Did the Cow Cross the Road I G

    题目描述 Why did the cow cross the road? Well, one reason is that Farmer John's farm simply has a lot of ...

  5. Python开发【第十一篇】函数

    函数 什么是函数? 函数是可以重复执行的语句块,可以重复调用并执行函数的面向过程编程的最小单位. 函数的作用: 函数用于封装语句块,提高代码的重用性,定义用户级别的函数.提高代码的可读性和易维护性. ...

  6. 告别硬编码,mysql 如何实现按某字段的不同取值进行统计

    上周我突然意识到,我在grafana上写的 sql 语句存在多处硬编码.这篇笔记将记录如何实现没有硬编码的sql语句,以及自学编程过程中如何应对自己的笨拙代码和难题不断的状况. 1.有效但粗笨的硬编码 ...

  7. Knative 实战:基于 Kafka 实现消息推送

    作者 | 元毅 阿里云智能事业群高级开发工程师 导读:当前在 Knative 中已经提供了对 Kafka 事件源的支持,那么如何基于 Kafka 实现消息推送呢?本文作者将以阿里云 Kafka 产品为 ...

  8. django1-环境搭建

    我的环境:win10 + pycharm2019.1.3 + python3.6.5 + Django2.1.10 安装django cmd下执行:pip install django==2.1.10 ...

  9. 百万年薪python之路 -- while循环

    day02 1.while循环 -- while关键字 while 空格 条件 冒号 缩进 循环体 while 5>4: print("Hello World!") 数字中非 ...

  10. dig-基本使用

    dig:Domain Information Groper,是一个DNS查询工具 1:使用google的域名服务器:查询特定域名的A记录 [root@localhost ~]# dig @8.8.8. ...