-
C# 多态性--关键字Abstract 和 Virtual
多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。
静态多态性
在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为:
- 函数重载
- 运算符重载
动态多态性
关键字 : Abstract
抽象方法:在基类中定义的并且必须在派生类中重写的方法,使用 abstract 关键字定义。
- 您不能创建一个抽象类的实例。
- 您不能在一个抽象类外部声明一个抽象方法。
- 通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。
1 namespace FirstCode.EX1 2 { 3 abstract public class Shape 4 { 5 abstract public int area(); 6 } 7 }
1 namespace FirstCode.EX1 2 { 3 public class Rectangle : Shape 4 { 5 public int width; 6 public int length; 7 8 public Rectangle(int a,int b) 9 { 10 width =a; 11 length = b; 12 } 13 public override int area()=>width*length; 14 15 } 16 }
1 namespace FirstCode 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Rectangle rect1 = new Rectangle(2,3); 8 Console.WriteLine("矩形的面积:"+rect1.area().ToString()); 9 } 10 } 11 }
关键字:Virtual
虚方法:即为基类中定义的允许在派生类中重写的方法,使用virtual关键字定义。
注意:虚方法也可以被直接调用。
1 namespace FirstCode.EX2 2 { 3 public class Shape 4 { 5 public virtual void Drawing() 6 { 7 Console.WriteLine("执行基类的画图任务"); 8 } 9 } 10 }
1 namespace FirstCode.EX2 2 { 3 public class Rectangle : Shape 4 { 5 public override void Drawing() 6 { 7 System.Console.WriteLine("画一个矩形"); 8 base.Drawing(); 9 } 10 } 11 }
1 namespace FirstCode.EX2 2 { 3 public class Circle:Shape 4 { 5 public override void Drawing() 6 { 7 System.Console.WriteLine("画一个圆"); 8 base.Drawing(); 9 } 10 } 11 }
1 namespace FirstCode 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 EX2.Rectangle rect2 = new EX2.Rectangle(); 8 rect2.Drawing(); 9 10 EX2.Circle circle2= new Circle(); 11 circle2.Drawing(); 12 } 13 } 14 }
隐藏方法:在派生类中定义的和基类中的某个方法同名的方法,使用 new 关键字定义。
注意:
- (1)隐藏方法不但可以隐藏基类中的虚方法,而且也可以隐藏基类中的非虚方法。
- (2)隐藏方法中父类的实例调用父类的方法,子类的实例调用子类的方法。
- (3)和上一条对比:重写方法中子类的变量调用子类重写的方法,父类的变量要看这个父类引用的是子类的实例还是本身的实例,如果引用的是父类的实例那么调用基类的方法,如果引用的是派生类的实例则调用派生类的方法。
关系和区别:
动态多态性是通过 抽象类 和 虚方法 实现的。
virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。
- 1.virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不能实现。
- 2.virtual可以被子类重写,而abstract必须被子类重写。
- 3.如果类成员被abstract修饰,则该类前必须添加abstract,因为只有抽象类才可以有抽象方法。
- 4.无法创建abstract类的实例,只能被继承无法实例化。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式