一步一步学c#(四):继承
继承
1·继承的类型
在面向对象的编程中,有两种截然不同的继承类型,实现继承和接口继承。
实现继承:表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数。
接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码。
结构和类
结构总是派生自System.ValueType,它们还可以派生自任意多个接口。
类总是派生自用户选择的另一个类,它们可以派生自任意多个接口。
实现继承
声明派生自另一个类的一个类,语法如下:

如果在定义中没有指定基类,编译器就会默认为System.object是基类,所以下面的两段代码结果一样:

虚方法
把一个基类函数声明为virtual,就可以在任何派生类中重写该函数:

可以把属性声明为virtual,要在定义中添加关键字virtual:

成员字段和静态函数都不能声明为virtual,因为这个概念只对类中的实例函数有意义。
调用函数的基类版本
c#有一种特殊的语法用于从派生类中调用方法的基类版本:base.<MethodName>().假定派生自类中的一个方法要返回基类的方法90%的返回值,就可以使用语法:

}
密封类和密封方法
c#允许把类和方法声明为sealed。对于类,表示不能继承该类,对于方法,表示不能重写该方法:

在层次结构中添加无参数的构造函数
假定把每个人的名字初始化为字符串“<no name>”而不是null。就可以修改GenericCostomer中的代码:

在层次结构中添加带参数的构造函数
仅在顾客提供其姓名时才实例化顾客,带一个参数的GenericCustomer构造函数;

目前是正常运行,但是,编译器试图为派生类创建默认构造函数时,会产生一个错误,需要派生类提供一个构造函数,来避免这个编译错误:
可见性修饰符

类型定义可以是内部或共有的,这取决于是否希望在类型包含的程序集外部访问它:

不能把类型定义为protected,private和protected internal,因为这些修饰符对于包含在名称空间中的类型没有意义。
其他修饰符

接口
下面列出Microsoft预定义的一个接口system。idisposabl的完整定义。

声明接口在语法上与声明抽象类完全相同,接口只能包含方法,属性,索引器和事件的声明。
定义和实现接口
开发一个循环接口继承规范的小例子来说明如何定义和使用接口:
此例建立在银行账户的基础上。
首先,需要定义IBankAccount接口:

下面是第一个,一个由Royal Bank of Venus运行的存款账户:


为了说明不同的类如何实现相同的接口,下面假定Planetary Bank of Jupiter还实现一个类,GoldAccount来表示其银行账户中的一个:
测试他们用一些using语句:
}
执行结果:
派生的接口
定义一个新的接口ITransferBankAccount来说明,该接口的功能与IBankAccount相同,只是定义了一个方法,把资金直接转到另一个账户:

下面说明ITransferBankAccount:假定Planetary Bank of jupiter还提供了一个当前账户,

验证该类:


一步一步学c#(四):继承的更多相关文章
- 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计
本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...
- 一步一步学Vue(四)
接上篇.上篇中给出了代码框架,没有具体实现,这一篇会对上篇定义的几个组件进行分别介绍和完善: 1.TodoContainer组件 TodoContainer组件,用来组织其它组件,这是react中推荐 ...
- (转载)一步一步学Linq to sql系列文章
现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...
- 【DG】[三思笔记]一步一步学DataGuard
[DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...
- 一步一步学ROP之linux_x64篇
一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...
- 一步一步学ROP之linux_x86篇
一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...
- 一步一步学android控件(之六) —— MultiAutoCompleteTextView
今天学习的控件是MultiAutoCompleteTextView . 提到MultiAutoCompleteTextView 我们就自然而然地想到AutoCompleteTextView ,就想知道 ...
- 一步一步学Silverlight 2系列(30):使用Transform实现更炫的效果(下)
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 一步一步学Silverlight 2系列(29):使用Transform实现更炫的效果(上)
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 一步一步学Silverlight 2系列(28):图片处理
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
随机推荐
- BuildSigar
https://support.hyperic.com/display/SIGAR/Home;jsessionid=7436F86CA13B66BCE1A827043E159F34#Home-down ...
- 可以使用QT给龙芯开发软件
直接apt-get install libqt5core5a就有了,也许是一个很好的小众市场机会呢 至于系统,可以使用debian mips https://www.debian.org/devel/ ...
- 网易云课堂_程序设计入门-C语言_第六章:数组_2鞍点
2 鞍点(5分) 题目内容: 给定一个n*n矩阵A.矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最大数,第j列上的最小数.一个矩阵A也可能没有鞍点. 你的任务是找出A的鞍点. 输入格 ...
- 关于nodejs,request模块的一个bug
今天在使用request时发生了一个错误, 对方网站的证书设置的不正确导致本地请求不能返回数据: 解决方案是在配置request时加入一个忽略证书验证得字段: 具体代码如下 request.post( ...
- adhoc-海量数据多维自助即席查询平台-mdrill项目开源啦
adhoc-海量数据多维自助即席查询平台-mdrill项目开源啦 1:mdrill是阿里妈妈-adhoc-海量数据多维自助即席查询平台下的一个子项目. 2:mdrill旨在帮助用户在几秒到几十秒的时间 ...
- ubuntu 下 apache+tomcat整合_(mod-jk方法)[转]
整合的平台是Centos5环境如下: apache源代码包: httpd-2.2.11.tar.gz 下载地址http://labs.xiaonei.com/apache-mirror/httpd/ ...
- 编程好帮手----CodeSmith Generator Studio
这是一个很好用的代码生成器,可以将数据库中的表生成类,这是和表中的字段一一对应这就很给力了,方便准确
- .NET程序员生活开始
不知不觉,开始踏入程序员生活了!加油吧.有关Session的好文章: 最近这两天被一个Web Farm环境下的Session处理问题虐得很痛苦,网上到处找解决方案,在无意中翻看到这篇文章,感觉很不错, ...
- Thinkphp利用微信多客服消息推送取货二维码消息
首先看微信官方的说法: 当用户主动发消息给公众号的时候(包括发送信息.点击自定义菜单.订阅事件.扫描二维码事件.支付成功事件.用户维权), 微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改 ...
- 动态改变ComboBox下拉框的宽度
在C++Builder中有时下拉框的内容比较长,标准长度下根本显示不完,可以调用PostMessage()方法来实现 ::PostMessage(comb->Handle,CB_SETDROPP ...