继承

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#(四):继承的更多相关文章

  1. 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计

    本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...

  2. 一步一步学Vue(四)

    接上篇.上篇中给出了代码框架,没有具体实现,这一篇会对上篇定义的几个组件进行分别介绍和完善: 1.TodoContainer组件 TodoContainer组件,用来组织其它组件,这是react中推荐 ...

  3. (转载)一步一步学Linq to sql系列文章

    现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...

  4. 【DG】[三思笔记]一步一步学DataGuard

    [DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...

  5. 一步一步学ROP之linux_x64篇

    一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...

  6. 一步一步学ROP之linux_x86篇

    一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 ​ 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...

  7. 一步一步学android控件(之六) —— MultiAutoCompleteTextView

    今天学习的控件是MultiAutoCompleteTextView . 提到MultiAutoCompleteTextView 我们就自然而然地想到AutoCompleteTextView ,就想知道 ...

  8. 一步一步学Silverlight 2系列(30):使用Transform实现更炫的效果(下)

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  9. 一步一步学Silverlight 2系列(29):使用Transform实现更炫的效果(上)

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  10. 一步一步学Silverlight 2系列(28):图片处理

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

随机推荐

  1. Delphi XE6 试用Android视频采集

    FMX支持视频采集,具体见FMX.Media,提供了很类支持音频.视频的处理. 按帮助文档,用Note3做了测试,结果,效率太低,不可用. 具体可查询帮助Video Capturing一节,我就是按这 ...

  2. node.js 入门教程(beginnder guide

    非常好的教程: node入门: JavaScript与Node.js JavaScript与你 简短申明 服务器端JavaScript “Hello World” 一个完整的基于Node.js的web ...

  3. 剑指Offer:面试题25

    题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.九度OJ地址:http://ac.jobdu.c ...

  4. StudentSchema student实例数据库环境搭建

    环境搭建 查看默认表空间和临时表空间 select tablespace_name from dba_tablespaces: 创建用户 并给用户设置默认表空间和临时表空间 SQL> creat ...

  5. jquery中read与js中onload区别

    在JavaScript中,onload函数是最经常使用的,几乎涉及到JavaScript的童鞋都少不了要接触它.这个函数的作用就是等待网页完全装载完了以后再去执行代码块内的语句,因为按照文档流的执行顺 ...

  6. 9大理由告诉你为什么应该学习HTML跟CSS

    你是不是听过太多人告诉你:「人人都应该要会 coding!」都快要不耐烦了对吧? 究竟为什么身为一个行销专业者.作家.金融巨擘--,整个世界还要你学会 coding? 事实上仅仅要对 HTML.CSS ...

  7. OC中文件的操作

    OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了哪些可以操作文 ...

  8. 项目中经常用到的reset.css文件

    html,body{width:100%; height: auto;} *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box- ...

  9. c++中basic_istream::getline()的返回值何时为真

    今天在看primer,17ch中的IO库再探,做课后练习,要求用ifstream.getline(char*, const unsigned, char)读取一个文件,用循环: while(ifs.g ...

  10. EC读书笔记系列之5:条款9、条款10

    条款9 绝不在构造和析构过程中调用virtual函数 记住: ★在构造和析构期间不要调用virtual函数,∵这类调用从不下降至derived class ---------------------- ...