C#_02.15_基础六_.NET类

一、类继承是一个类在另一个类的基础上进行的扩展。

继承的子类拥有父类的全部成员。索引子类拥有本身的全部成员以及父类的全部成员。

可以对基类成员进行隐藏,如果必须的话,方法是在子类中定义和父类成员一样签名的成员,并且在访问修饰符之前加入new关键字,就可以对父类的成员进行隐藏。

如果对于已经隐藏的父类成员后面需要进行访问,那么可以使用的方法是base关键字,base关键字注意点如下:

1、只能在子类当中使用,代表的是父类的成员;

2、调用基类成员的方法是使用“.”运算符。

如下:

二、类型转换的实质:

一个类的实例包含了他的基类的实例以及他本身成员的实例,如果我们获得了一个类的引用(就是实例创建表达式返回的值),那么就可以通过类型转换转换获得基类的实例的引用,在基类的实例的引用中是无法看到子类成员的。所以类型转换实质上是引用的转换,转换了引用之后,能够看到的成员就会发生改变。所以转换成父类的实例无法访问子类中的成员。因此我们有一个方法是可以改进这一点的,那就是使用 virtual 和 override 两个关键字使得在使用类型转换把子类转换成父类类型之后的实例可以访问子类的成员。

注意点:在覆写方法中,如果一个方法被通过基类调用,那么该方法被调用的顺序是从被转换成基类的哪一个实例的类型所在的层级开始想基类调用,调用遇到第一个override关键字的方法。

总结new 和virtual & override:

New的作用是隐藏父类中的成员,而override作用是使被转换成基类类型的子类对象仍旧可以使用子类的成员(方法,属性,字段......)。

三、创建一个实例的过程:

创建一个实例我们一直以为是先执行基类的构造函数然后执行子类的构造函数,一直以为构造函数是最先执行的,现在才明白原来错了,实例化一个对象我们最先执行的是对实例化成员进行实例化:如一个类当中声明了一些字段,那就是先执行这些字段的代码,但是这一过程调试是调试不出来的。

想想执行构造函数的时候那些我们声明或者已经初始化的字段属性是已经可以使用了的就可以理解了。

AND 构造函数执行的两个特殊点:

我们知道,创建类实例的时侯是先执行父类的构造函数再执行子类的构造函数,而我们又知道构造函数是无返回值但可以进行重载的函数,所以一个父类不一定只具有一个的构造函数,因此我们就需要指定我们到底是调用了哪一个的构造函数,使用的关键字是base。

使用方法就是在子类的构造函数名后面加上:“:base(参数列表)”,来一个eg:

AND:还有一个关键字“this”:这个关键字的作用是调用类本身的构造函数,使用的情境我理解为一个类有一些公共的成员需要进行初始化,又有很多的构造函数,如果我们每一个函数里面都写一遍那就变得很麻烦,代码又会出现冗余,因此选择的策略是弄一个公共的构造函数,使用this调用,调用方式和使用base是一样的,至于为啥要这么调用而不是选择在其他的构造函数里面调用这个公共的构造函数,因为编译器知道他是一个构造函数会进行优化,巴拉巴拉之类的我也不懂。

四、访问修饰符说明:

修饰符

可见性

private

仅仅在当前类可见,子类其他类都不可见

protect

在当前类和子类中都可见

internal

在当前程序集中可见,其他程序集中不可见

protect internal

当前程序集可见,其他程序集中继承这个类的子类也可见,这个访问级别是protect+internal的并集。

public

没有访问限制

五、抽象成员:

抽象成员是指用abstract修饰的成员,不过要记得三个要点:

1) 抽象成员只能是函数形式的成员:比如说方法、事件、属性、索引器,而不能是字段常量

2) 必须使用abstract修饰

3) 必须不能够写方法体,只能够有函数名字;

#

virtual

abstract

含义

虚对象,

抽象成员

使用对象

事件方法属性索引器

事件属性方法索引器

不能使用

字段、常量

字段、常量

覆写

非必须

必须被覆写

方法体

有方法体

不能写方法体

类注意

无需添加其他

类必须声明成抽象类,添加abstract修饰符

六、抽象类:

抽象类只能够被继承而无法实例化,必须使用关键字abstract修饰,只要一个类当中有抽象成员那么这个类就是抽象类,抽象类可以继承自另一个抽象类,继承的抽象类不需要覆写当中的抽象成员,但是如果继承抽象的的类不在是抽象了就需要覆写该抽象类中的所有抽象成员。

七、密封类:

由sealed修饰的类成为密封类;密封类的特点是不可以被继承而只能够被实例化。

八、静态类:

静态类是用static修饰的类,在静态类中所有的成员都是静态的,静态类不能够被继承,静态类通常是一组数学方法或者是数据。静态类可以用静态的构造函数,但是不能有实例化的构造函数,静态类是不能创建实例的。一个典型的静态类是扩展方法。

九、扩展方法:

扩展方法三个点:

1) 必须是在静态类中的;

2) 必须是静态方法的;

3) 必须使用关键字this;

C#_02.15_基础六_.NET类的更多相关文章

  1. C#_02.14_基础五_.NET类

    C#_02.14_基础五_.NET类 一.类实例: 我们前面说过类是一个模板,我们通过类创建一个又一个的实例,通常情况下类当中的变量是每一个实例都各有一份的,互相不影响,而静态字段是除外的,静态字段是 ...

  2. C#_02.13_基础三_.NET类基础

    C#_02.13_基础三_.NET类基础 一.类概述: 类是一个能存储数据和功能并执行代码的数据结构,包含数据成员和函数成员.(有什么和能够干什么) 运行中的程序是一组相互作用的对象的集合. 二.为类 ...

  3. C#_02.13_基础四_.NET方法

    C#_02.13_基础四_.NET方法 一.方法概述: 方法是一块具有名称的代码.可以通过方法进行调用而在别的地方执行,也可以把数据传入方法并接受数据输出. 二.方法的结构: 方法头  AND  方法 ...

  4. C#_02.16_基础七_.NET表达式&运算符

    C#_02.16_基础七_.NET表达式&运算符 一.字面量: 字面量和变量的关系来理解字面量会比较简单: 因此字面量是源代码中键入已知的(我们知道它是多少的)值.也可以理解是等号右边的非创建 ...

  5. C#_02.12_基础二_.NET类型存储和变量

    C#_02.12_基础二_.NET类型存储和变量 一.核心一句:C#程序是一组类型声明(留待后面慢慢体会,现在不是很理解,不强说了) 二.数据类型: 1.预定义了16种数据类型: 其中13种简单数据类 ...

  6. C#_02.10_基础一_.NET框架

    C#_02.10_基础一_.NET框架 一.概念: .NET框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境. 解读: 1..net框架是一个编程环境, 2.可以进行多语言的开发和 ...

  7. Java基础六(自定义类、ArrayList集合)

    今日内容介绍1.自定义类型的定义及使用2.自定义类的内存图3.ArrayList集合的基本功能4.随机点名器案例及库存案例代码优化 ###01引用数据类型_类 * A: 数据类型 * a: java中 ...

  8. Vue(基础六)_嵌套路由(续)

    一.前言                  1.路由嵌套里面的公共路由                  2.keep-alive路由缓存                  3.导航守卫 二.主要内容 ...

  9. Java基础知识二次学习--第六章 常用类

    第六章 常用类   时间:2017年4月26日16:14:49~2017年4月26日16:56:02 章节:06章_01节~06章_06节 视频长度:20:57+1:15+8:44+1:26+11:2 ...

随机推荐

  1. [Bjoi2018]二进制

    题解: 首先发现性质 只有1个1的区间 或者 奇数个1且0的个数少于2这个区间是不合法的 然后这个东西暴力是比较好处理的 刚开始写的比较傻逼,分几种情况 先把0,1缩在一起 1.k1个0+1+k2个0 ...

  2. 【原创】python 豆瓣采集

    新手今天刚学python~~~ 有点凌乱~勉强看吧 只能算是给新手看看,见谅 简单版本的 豆瓣采集美图~~~~~~ 美女天天有 有木有~~~ python 3.4 sqlite3 BeautifulS ...

  3. ELK收集Nginx自定义日志格式输出

    1.ELK收集日志的有两种常用的方式: 1.1:不修改源日志格式,简单的说就是在logstash中转通过 grok方式进行过滤处理,将原始无规则的日志转换为规则日志(Logstash自定义日志格式) ...

  4. php通过CURL模拟post提交请求

    <?php header("Content-type:text/html;charset=utf-8"); class Test{ public function reque ...

  5. 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

    假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两 ...

  6. 007 numpy数组文件的存取

    不知道这个有没有用,都整理了一番. 一:数组以二进制格式进行存储 1.说明 np.save与np.load是读写磁盘数组数据的两个重要函数. 默认情况下,数组以压缩的原始二进制格式保存在扩展名为npy ...

  7. 解决java编译错误:编码GBK的不可映射字符

    新建java文件,存储时Encoding选择了UTF-8, 由于语句中包含中文,javac编译时报错,提示"编码GBK的不可映射字符": 解决办法: 1.使用javac -enco ...

  8. 一、网络编程-UDP传输协议及socket套接字使用

    知识点基本介绍:1.网络通信协议一般就是UDP和TCP俩种传输协议,这一章先说UDP,UDP是一种比较简单的传输协议,如qq使用的就是UDP          2.ip:ip就是标记网络中中的一台电脑 ...

  9. python之psutil模块(获取系统性能信息(CPU,内存,磁盘,网络)

    一.psutil模块 1. psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等) ...

  10. JVM之基本结构

    1. Java虚拟机的架构 1.1 Java的NIO库允许Java程序使用直接内存,访问直接内存的速度优于Java堆.出于性能的考虑,读写频繁的场合会考虑使用直接内存. 1.2 本地方法栈和Java栈 ...