C#动态多态性的理解
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#动态多态性的理解的更多相关文章
- C++学习之路—多态性与虚函数(一)利用虚函数实现动态多态性
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多态性是面向对象程序设计的一个重要特征.顾名思义 ...
- JDK动态代理深入理解分析并手写简易JDK动态代理(下)
原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-01-05/27.html 作者:夜月归途 出处:http://www.guitu ...
- JDK动态代理深入理解分析并手写简易JDK动态代理(上)
原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-01-03/27.html 作者:夜月归途 出处:http://www.guitu ...
- c#静态多态性与动态多态性
C# 多态性 多态性意味着有多重形式.在面向对象编程范式中,多态性往往表现为"一个接口,多个功能". 多态性可以是静态的或动态的.在静态多态性中,函数的响应是在编译时发生的.在动态 ...
- python中对多态和多态性的理解
python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多态的概念依赖于继承) import abc class Animal( ...
- Java(Android)编程思想笔记01:多态性的理解
1. 多态的定义: 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式. (发送消息就是函数调用) 2. 多态的理解 多态是面向对象的重要特性,简 ...
- 对JAVA动态代理的理解
叫动态代理就代表着有“静态代理”这回事. 而且,通常“动态”至少听着更NB一点. 关键就在于不明白啥叫“动”,这个得跟“静”比较下. 在我的理解,静态代理得自己声明一个类,实现跟被代理对象同样的接口. ...
- C++多态性的理解
本文章转载来自:http://www.sollyu.com/?p=627 代码 #include <iostream.h> class Animal { public: void eat( ...
- JavaScript 词法、静态、动态作用域初级理解
开始之前 由于本人也是JavaScript初学者,记录学习经过,怕以后会忘记. 对于JavaScript 初学者来说,最难的不是代码部分,而是对很多书籍中的术语的理解,大多时候想要理解一段JavaSc ...
随机推荐
- java架构之路-(Redis专题)Redis的主从、哨兵和集群
我们使用的redis,单机的绝对做不到高可用的,万一单机的redis宕机了,就没有备用的了,我们可以采用集群的方式来保证我们的高可用操作. 主从架构 大致就是这样的,一个主节点,两个从节点(一般两个就 ...
- Qt5教程: (4) 带参数信号与槽
在subwidget.h中声明一个signal. 和之前的信号函数重名但是有参数: void backSignal(QString); 之后在subwidget.cpp的槽函数sendSignal() ...
- splinter操作ie浏览器
splinter 是在selenium上的封装,很多操作更方便,但是默认似乎不能直接操作ie,通过修改browser.py文件,splinter\driver\webdriver下增加ie.py文件, ...
- burp插件之xssValidator
0x01 安装环境 Phantomjs 下载:http://phantomjs.org/download.html 下载后配置环境变量,把bin目录下的这个exe加入环境变量 xssValidator ...
- Python之单例模式的多种实现
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- linux-pclint代码检测
win10.ubuntu16.04, vs2017. 1.安装pc-lint到C盘. 2.将linux下的usr整个目录打包拷贝到win10某盘下. 3.获取lint检测linux c++ 代码的宏参 ...
- ESP8266开发之旅 网络篇⑭ web配网
1. 前言 目前,市面上流行多种配网方式: WIFI模块的智能配网(SmartConfig以及微信AirKiss配网) SmartConfig 配网方式 请参考博主之前的博文 ESP8266开 ...
- 原来热加载如此简单,手动写一个 Java 热加载吧
1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...
- vue 自定义侧边栏 递归无限子级菜单
有很多网站会涉及到导航栏,我自己在开发中用的是element导航组件,并且自定义事件,给大家分享一下. 1.使用递归方法,无限循环子级菜单. 2.使用组件封装,维护方便. 3.使用index作为路由跳 ...
- 百万年薪python之路 -- JS基础介绍及数据类型
JS代码的引入 方式1: <script> alert('兽人永不为奴!') </script> 方式2:外部文件引入 src属性值为js文件路径 <script src ...