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 ...
随机推荐
- 章节十七章、2- 给执行失败的case截图
一.案例演示 1.首先我们把截图的方法单独进行封装方便以后调用. package utilities; import java.io.File; import java.io.IOException; ...
- node.js当中的http模块与url模块的简单介绍
一.http模块的简单介绍 node.js当中的http内置模块可以用于创建http服务器与http客户端. 1.引包 const http = require('http'); 2.创建http服务 ...
- [USACO15DEC]高低卡(白金)High Card Low Card (Platinum)
题目描述 Bessie the cow is a hu e fan of card games, which is quite surprising, given her lack of opposa ...
- Shiro:未登录时请求跳转问题
问题:前后端分离项目,在用Shiro做权限控制时,未登录状态发送的请求都会重定向,导致前端无法捕捉重定向后的消息.如何不重定向在原来的请求返回信息提示未登录,前端根据信息调到登录页? 首先,看一下Sh ...
- 一文详解CentOS6.5搭建DNS服务
本文详细介绍DNS服务在Linux Operation System 中的搭建过程 一.DNS服务器的工作原理 客户机提出域名解析请求,并将该请求发送给本地的域名服务器.当本地的域名服务器收到请求后, ...
- ssd原理及代码实现详解
通过https://github.com/amdegroot/ssd.pytorch,结合论文https://arxiv.org/abs/1512.02325来理解ssd. ssd由三部分组成: ba ...
- 百万年薪python之路 -- 迭代器
3.1 可迭代对象 3.1.1 可迭代对象定义 **在python中,但凡内部含有 _ _ iter_ _方法的对象,都是可迭代对象**. 3.1.2 查看对象内部方法 该对象内部含有什么方法除了看源 ...
- vue.js 使用 vue-router 修改页面标题
module.exports = { name: 'myComponent', data: {} route{ data: function(){ document.title = "页面标 ...
- 搭建 webpack + react 框架爬坑之路
由于工程实践需要搭一个 webpack + react 框架,本人刚开始学,就照b站上的react黑马视频做,爬过无数个坑...希望读者能引以为戒.我的是macos系统 https://www.bil ...
- JVM概述和类加载器
JVM概述 1.Java虚拟机所管理的内存包括以下几个运行时数据区域: ①.程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是 ...