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: }
C# 读书笔记之访问虚方法、重写方法和隐藏方法的更多相关文章
- C# 读书笔记之访问关键字this和base
this 关键字引用类的当前实例.静态成员方法中不能使用this关键字,this关键字只能在实例构造函数.实例方法或实例访问器中使用. base 关键字用于从派生类中访问基类的成员. 指定创建派生类实 ...
- 《ASP.NET MVC高级编程(4版)》读书笔记(5)表单和HTML辅助方法
5.1 表单使用 5.1.1 action 和 method 特性 <form action="/Home/Index"> <input name=&qu ...
- Effective Java 读书笔记之二 对于所有对象都通用的方法
尽管Object是一个具体的类,但设计它主要是为了扩展.它的所有非final方法都有明确的通用约定.任何一个类在override时,必须遵守这些通用约定. 一.覆盖equals时请遵守通用的约定 1. ...
- C# 方法重载 overload、方法重写 override、隐藏 new
一.重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同.这样才能通过传递不同的参数来决定到底调用哪一个. 值得注意的是,方法重载只有通过参数不同来判断调用哪个方法, ...
- 【原】自定义UINavigationItem的两种方法以及相应的隐藏方法
第一种: UIImage *searchimage=[UIImage imageNamed:@"search.png"]; UIBarButtonItem *barbtn=[[[U ...
- 自定义UINavigationItem的两种方法以及相应的隐藏方法
第一种: UIImage *searchimage=[UIImage imageNamed:@"search.png"]; UIBarButtonItem *barbtn=[[[U ...
- Struts 2读书笔记-----Action访问Servlet API
Action访问Servlet API Struts2中的Action并没有和任何Servlet API耦合,这样框架更具灵活性,更易测试. 对于Web应用的控制器而言,不访问ServletAPI是几 ...
- 《大型网站系统与JAVA中间件实践》读书笔记-数据访问层
数据访问层 5.1.2数据库垂直/水平拆分的困难 随着网站业务的快速发展,数据量和访问量不断上升,数据库的压力越来越大. 更换更好的硬件(Scale Up)是一种解决方案,而且在我们能付得起硬件费用并 ...
- 【读书笔记】iOS-安全地传输用户密码的方法
正确做法:事先生成一对用于加密的公私钥,客户端在登录时,使用公钥将用户的密码加密后,将密文传输到服务器.服务器使用私钥将密码解密,然后加盐之后多次请求MD5,之后再和服务器原来存储的用同样方法处理过的 ...
随机推荐
- 谷歌识图、google识图如何知道图片相似?
转自:http://www.hahait.com/news/185.html 原理非常简单易懂.我们可以用一个快速算法,就达到基本的效果.这里的关键技术叫做“感知哈希算法”(Perceptual ha ...
- Facebook、新浪微博、Twitter、腾讯微博分享代码
最近总结一下用到的分享代码 FaceBook分享 <a href="https://www.facebook.com/sharer/sharer.php?u=你的链接" ta ...
- 手机root初体验
看到别人写的一些自己想知道的东西,顿时感到很有兴趣也很强大,固然做一个牛人有很多小粉丝是无比崇高的,可去往牛人的路上也不能少了自己~加油! 一 我来解释一下什么是ROOT以及原理 是不是要ROOT,是 ...
- select2简单例子
1.html中静态值 html <%--multiple 为多选--%> <select multiple id="e1"> <option>& ...
- ASP.NET MVC View向Controller传值方式总结
1:QueryString传值1)也可以使用new{}来为form的action增加querystring2)在controler里使用Request.QueryString["word&q ...
- C++から広がり
泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库.所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能 ...
- Python 错误和异常
1.Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不 ...
- Asp.Net Core WebApi学习笔记(四)-- Middleware
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
- OSG中的智能指针
在OpenSceneGraph中,智能指针(Smart pointer)的概念指的是一种类的模板,它针对某一特定类型的对象(即Referenced类及其派生类)构建,提供了自己的管理模式,以避免因为用 ...
- 基于视觉的Web页面分页算法VIPS的实现源代码下载
基于视觉的Web页面分页算法VIPS的实现源代码下载 - tingya的专栏 - 博客频道 - CSDN.NET 基于视觉的Web页面分页算法VIPS的实现源代码下载 分类: 技术杂烩 2006-04 ...