C#高级编程 (第六版) 学习 第四章:继承
第四章 继承
1,继承的类型
实现继承:
一个类派生于一个基类型,拥有该基类型所有成员字段和函数。
接口继承
一个类型只继承了函数的签名,没有继承任何实现代码。
2,实现继承
|
class MyDerivedClass:MyBaseClass,IInterface1,IInterface2 { } |
|
public struct MyderivedStruct:IInterface1, IInterface2 { } |
类只能继承一个基类,但可以继承多个接口
结构不能继承结构,但是结构能够继承接口
虚方法:
在基类中将方法声明为virtual,即可在派生类中重写,属性也支持virtual。
在派生类中重写基类方法时,需要显式地声明为override。
成员字段和静态函数都不能声明为virtual
隐藏方法:
如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有被声明为virtual或者override,派生类方法就会隐藏基类方法。
如果派生类需要隐藏方法,应该使用new关键字,否则编译器会提示警告
|
class yDerivedClass:HisBaseClass { public new int MyMethod() { } } |
调用函数的基类版本
使用base.<MethodName>()调用函数的基类版本。
抽象类和抽象函数
将类和函数声明为abstract,抽象类不能实例化,抽象函数没有执行代码,必须在非抽象的派生类中重写。抽象函数总是虚拟的,但是不能显式地声明为virtual,会报错。如果类包含抽象函数,则类必须声明为抽象的。
密封类和密封方法
C#允许将类和方法声明为sealed。对于类,表示不能继承,对于方法,表示不能重写。
要在方法或者属性上使用sealed,必须现在基类上声明为虚拟的。否则会报错。
修饰符
可见性修饰符
|
修饰符 |
应用于 |
说明 |
|
public |
所有类型或者成员 |
任何代码均可以访问该方法 |
|
protected |
类型和内嵌类型的所有成员 |
只有派生的类型能够访问该方法 |
|
internal |
类型和内嵌类型的所有成员 |
只能在包含它的程序集中访问该方法 |
|
private |
所有的类型或成员 |
只能在它所属的类型中访问该方法 |
|
protected internal |
类型和内嵌类型的所有成员 |
只能在包含它的程序集和派生类型的代码中访问该方法 |
类型不能定义为protected,private和protected internal,这些修饰符对于包含在命名空间中的类型来说是没有意义的。编译器也会报错。
但是对于嵌套类型,是有效的。
|
public class OuterClass { protected class InnerClass {
} } |
嵌套的内部类型总是可以访问外部类的所有成员,包括私有成员。
4,接口
声明接口
以:System.IDisposable接口为例:
|
public interface IDisposable { void Dispose(); } |
声明接口和声明抽象类在语法上是一致的,但不允许提供接口中任何成员的执行方式。一般情况下,接口中只能包含方法、属性、索引器和事件的声明。
不能实例化接口,它只能包含其成员的签名。接口不能有构造函数或者字段。也不能有运算符重载。
在接口定义还不允许声明成员上的修饰符。接口成员总是公有的,不能声明为虚拟的或者静态的。
实现接口的类必须提供所有接口方法和属性的实现代码。
接口仅表示成员的存在性,类负责确定这些成员是虚拟的还是抽象的。
接口可派生,派生方法和类的继承相同。
C#高级编程 (第六版) 学习 第四章:继承的更多相关文章
- C#高级编程 (第六版) 学习 第七章:委托和事件
第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...
- C#高级编程 (第六版) 学习 第五章:数组
第五章 数组 1,简单数组 声明:int[] myArray; 初始化:myArray = new int[4]; 为数组分配内存. 还可以用如下的方法: int[] myArray = new in ...
- C#高级编程 (第六版) 学习 第三章:对象和类型
第三章 对象和类型 1,类和结构 类存储在托管堆上 结构存储在堆栈上 2,类成员 类中的数据和函数称为类成员 数据成员 数据成员包括了字段.常量和事件 函数成员 方法:与某个类相关的函数,可以 ...
- C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换
第六章 运算符和类型强制转换 1,运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ ...
- C#高级编程 (第六版) 学习 第一章:.Net体系结构
第一章 .Net体系结构 1,公共语言运行库(Common Language Runtime, CLR) .Net Framework的核心是其运行库的执行环境,称为公共语言运行库,或.Net运行库. ...
- C#高级编程(第六版)学习:第三十一章:Windows窗体
第三十一章 Windows窗体 创建Windows窗体应用程序 在文本编辑器中输入: /* * form.cs * a simple windows form * */ using System; u ...
- C#高级编程 (第六版) 学习 第二章:C#基础
第二章 基础 1,helloworld示例: helloworld.cs using System; using System.Collections.Generic; using System.Li ...
- c#高级编程第七版 学习笔记 第一章 .NET体系结构
第一章 .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...
- c#高级编程第七版 学习笔记 第二章 核心c#
第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...
随机推荐
- jenkins+maven+docker集成java发布(二)#远程发布
jenkins+maven+docker集成java发布(一)中写了在Jenkins服务器自动部署业务,那需要将java项目部署到其他服务器怎么操作 这里需要依赖插件Publish Over SSH ...
- tensorflow 模型权重导出
tensorflow在保存权重模型时多使用tf.train.Saver().save 函数进行权重保存,保存的ckpt文件无法直接打开,不利于将模型权重导入到其他框架使用(如Caffe.Keras等) ...
- 【leetcode 简单】 第五十二题 有效电话号码
给定一个文本文件 file.txt,请只打印这个文件中的第十行. 示例: 假设 file.txt 有如下内容: Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Li ...
- Oracle入门第五天(上)——数据库对象之视图
一.概述 1.什么是视图(VIEW) 视图 从表中抽出的逻辑上相关的数据集合(是一张虚表). 2.为什么使用视图 1.控制访问 2.简化查询 3.视图的分类 二.视图管理 1.创建视图 CREATE ...
- 学号20155308 2016-2017-2 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
学号20155308 2016-2017-2 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验要求 使用JDK编译.运行简单的Java程序. 使用IDEA 编辑.编译 ...
- 20145226夏艺华 《Java程序设计》实验报告四
实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试 了解Android组件.布局管理器的使用 掌握Android中事件处理机制 Andro ...
- javaWeb项目-文件下载的消息头和编码问题
一.问题: 做web项目经常提到的一个需求就是页面的文件下载,那么下载的时候在后台为什么要设置响应消息头?为什么这样设置? 二.解决: 1.例子 //设置响应的消息头response.setConte ...
- BZOJ2039_employ人员雇佣_KEY
题目传送门 网络流,求最小割. 设tot为所有盈利的和,即所有人(不花钱)雇佣. 对于S->i建一条容量为c[i]的边,i->j建一条S[i][j]*2的边,之所以这样建是因为如果不选这个 ...
- GridSQL--Stado 学习初步
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL集群方案相关索引页 回到顶级页面:PostgreSQL索引页 作者 高健@博客园 luckyjackgao ...
- cogs2109 [NOIP2015] 运输计划
cogs2109 [NOIP2015] 运输计划 二分答案+树上差分. STO链剖巨佬们我不会(太虚伪了吧 首先二分一个答案,下界为0,上界为max{路径长度}. 然后判断一个答案是否可行,这里用到树 ...