C# 读书笔记之访问虚方法、重写方法和隐藏方法
C#允许派生类中的方法与基类中方法具有相同的签名:基类中使用关键字virtual定义虚方法;然后派生类中使用关键字override来重写方法,或使用关键字new来覆盖方法(隐藏方法)。
重写方法用相同的签名重写所继承的虚方法。虚方法声明用于引入新方法,而重写方法或隐藏方法声明则是用于使现有的继承虚方法专用化(通过提供该方法的新实现)
注意:如果签名相同的方法在基类和派生类都进行了声明,但该方法没有声明为virtual和override/new,则派生类方法就会隐藏基类方法,但系统编译时会产生警告信息。因为隐藏方法会存在为给定类的实例调用错误方法的危险,故应该显示地定义隐藏方法。
调用虚方法时,将首先检查该对象的运行时类型,并调用派生类中的该重写成员。如果没有派生类重写该成员,则调用其原始数据。
默认情况下,C#方法是非虚拟的。不能重写非虚方法,重写非虚方法将导致编译错误。
除了类方法外,还可以使用virtual关键字其他类成员以定义虚成员,包括属性【无参属性】、索引器【含参属性】或事件声明。虚拟成员的实现可在派生类使用关键字override来重写;或使用关键字new来覆盖。
注意:virtual 修饰符不能与static、abstract、private或override修饰符一起使用。
例:
虚方法,重写方法和隐藏方法示例:Dimensions类包含x,y两个坐标和Area()虚方法。Dimensions类的派生类(Circle、Cylinder和Sphere)均重写了基类的虚方法Area()以实现不同图形表面积的计算。调用虚方法Area()时,将根据此方法关联的运行时对象调用适当的Area()实现,为每个图形计算并显示适当的面积。
1: namespace ConsoleApplication2
2: {
3:
4:
5:
6: public class Dimensions
7: {
8:
9: public const double PI = Math.PI;
10: protected double x, y;
11: public Dimensions()
12: {
13:
14: }
15:
16: public Dimensions(double x, double y)
17: {
18: this.x = x;
19: this.y = y;
20: }
21:
22: public virtual double Area()
23: {
24: return x * y;
25: }
26:
27: }
28:
29: public class Circle : Dimensions //派生类:圆
30: {
31: public Circle(double r)
32: : base(r, 0)
33: {
34:
35: }
36:
37: public override double Area()
38: {
39: //园的面积
40: return PI * x * x;
41: }
42: }
43: public class Sphere : Dimensions //派生类:球体
44: {
45: public Sphere(double r)
46: : base(r, 0)
47: {
48:
49: }
50:
51: public override double Area()
52: {
53: //球体的表面积
54: return 4 * PI * x * x;
55: }
56: }
57: public class Cylinder : Dimensions //派生类:圆柱体
58: {
59: public Cylinder(double r)
60: : base(r, 0)
61: {
62:
63: }
64:
65: public override double Area()
66: {
67: //圆柱体的表面积
68: return 2 * PI * x * x + 2 * PI * x * y;
69: }
70: }
71:
72: public class Program
73: {
74:
75:
76: static void Main(string[] args)
77: {
78: double r = 3.0, h = 5.0;
79: Dimensions c = new Circle(r); //圆
80:
81: Dimensions s = new Sphere(r); //球体
82:
83:
84: Dimensions l = new Cylinder(r); //圆柱体
85:
86: //显示各种不同形状的表面积
87:
88: Console.WriteLine("圆的面积={0:f2}",c.Area());
89: Console.WriteLine("球体的面积={0:f2}", s.Area());
90: Console.WriteLine("圆柱体的面积={0:f2}", l.Area());
91: Console.ReadKey();
92: }
93: }
94: }
转载于:https://www.cnblogs.com/jlcoder/p/3515316.html
C# 读书笔记之访问虚方法、重写方法和隐藏方法相关推荐
- 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)
27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...
- 【读书笔记】《数学之美》——一个好方法在形式上总是简单的
数学之美 作者简介 内容简介 摘抄语录 收获感悟 牛顿曾说"(人们)发觉真理在形式上从来是简单的,而不是复杂和含混的."数学的美妙之处在于它对自然界史诗的总结和归纳,也是抽象思考的 ...
- 读书笔记 PCG in Games 程序化内容生成3 构造性方法,针对地牢式关卡
总起 本文主要基于Procedural Content Generation in Games第三章介绍构造性方法,他们的主要用途在于地牢和关卡,这些方法能在极短进行生成,并且不会进行评估或重新生成. ...
- php protected 的继承,14 PHP 类的继承 [public protected private] parent 构造方法 析构方法 重写 最终类和方法 设计模式...
类的继承 简单理解: 某个类A具有某些特征,另一个类B,也具有A类的所有特征,并且还可能具有自己的更多的一些特征,此时,我们就可以实现:B类使用A的特征信息并继续添加自己的一些特有特征信息. 基本概念 ...
- 方法重写实例java,java方法重写实例分析
本文实例讲述了java方法重写,分享给大家供大家参考.具体分析如下: 一.方法的重写概述: 1.在子类中可以根据需要对从基类中继承来的方法进行重写. 2.重写的方法和被重写的方法必须具有相同方法名称. ...
- 【原】自定义UINavigationItem的两种方法以及相应的隐藏方法
第一种: UIImage *searchimage=[UIImage imageNamed:@"search.png"]; UIBarButtonItem *barbtn=[[[U ...
- 读书笔记:《做出明智判断的10个方法》
假期阅读的这本<做出明智判断的10个方法>,详细介绍看:https://book.douban.com/subject/34912009/ 摘录重要的笔记: 1 保持怀疑,但不要怀疑一切 ...
- 【读书笔记-数据挖掘概念与技术】分类:高级方法
贝叶斯信念网络 这个贝叶斯信念网络和上一章学的朴素贝叶斯分类,最大的不同点在于: 朴素贝叶斯分类法假定类条件独立,即给定元组的类标号,假定属性的值可以条件地相互独立.这一假定简化了计算. 贝叶斯信念网 ...
- php方法重载方法重写_Java基础之方法的重载
重载的定义:在同一个类中,方法名相同,只要它们的参数个数或者 参数类型不同即可. // 如下的四个方法构成了重载 public void getSum(int i,int j) { System.ou ...
- Java10-day01【继承(变量-构造方法访问-成员方法 访问)、super内存图、方法重写、继承、包、import、权限修饰符、final、static】
视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] Java基础--学习笔记(零起点打开java ...
最新文章
- html5 websocket发送图片,通过WebSocket连接,实现Image从服务器到浏览器的传输
- buu [HDCTF2019]bbbbbbrsa
- sqlite3数据库的性能问题报告
- WindowsXP 下的pix模拟器出炉了!!!
- php的session怎么用,php $_session怎么用
- SVG_text.动态创建换行显示(横)
- python list大小_4个python常用高阶函数的使用方法
- bzoj 1034: [ZJOI2008]泡泡堂BNB(贪心)
- Mysql表设计需要注意的问题
- GNU make manual 翻译( 一百四十)
- 常见基本题型:进制的转换
- STM8L052低功耗模式
- Linux工具篇 | Linux下安装repo工具
- java事务 深入Java事务的原理与应用
- wince +C#拼音码形成代码
- Use SageMath with PyCharm/PyDev (Use PyCharm/PyDev to run and debug SageMath scripts)
- always@(敏感列表)
- 内网虚拟机静态IP设置VMWare内网通外网不通把某一网段白名单虚拟机ping不通主机虚拟机桥接改成非192.168网段服务器与电脑直连共享wifi
- c语言何钦铭,C语言 何钦铭
- 格式化磁盘重装ubuntn18.04系统后恢复timeshift备份文件
热门文章
- 【Django 2021年最新版教程23】2个日期相减 计算天数 xxxx-xx-xx格式
- 微信小程序云开发教程-一文学会Json
- linux备份根目录与还原脚本,Shell脚本备份和还原MBR(主引导记录)
- JAVA中map删除键值对_以有效的方式从Map中删除多个键?
- html5编写商城页面,HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第2章HTML基础知识...
- html span设置外边距,行内元素内外边距探究:为何span设置上下margin和padding不起效...
- php 通过file_get_contents获取其他页面的内容(以及模仿表单post提交)
- 浏览器对象模型(Browser Object Model)
- 六、面向对象编程——类和对象
- 进来偷学一招,数据归档二三事儿