《C#图解教程》读书笔记第7章——类和继承

这本书讲解 C# 语言十分详细,我将其中的重要内容整理成条款,以备忘。


 

 

1.       派生类不能删除它继承的任何成员,但可以通过 new 修饰符隐藏它们。若要隐藏一个基类成员,需要在派生类中声明一个相同名称,相同类型的成员,若是方法则需签名相同,但不包括返回值 。要让编译器知道是故意隐藏继承的成员,使用 new 修饰符。若要在派生类中 访问被隐藏的基类成员 ,可以使用 base 表达式。

 

2.       派生类的引用指向整个派生类的对象 ( 包括基类的对象加上派生类附加的成员 ) ,通过类型转换运算符,当有一个派生类对象的引用时,就可以获取该对象基类部分的引用。在没有虚成员被派生类覆写的情况下 ,通过基类部分的引用,只能 访问派生类对象基类部分的成员派生类附加的 ( 即派生类自己的 ) 成员对其是不可见的

 

3.       只有使用派生类对象的基类引用调用被覆写过 (override) 的方法时才会引发多态 ,若方法没有被 override ,则情况同第 2 条所述。关于 virtual override 修饰符: 1. 覆写和被覆写的方法必须有相同的可访问性 2. 不能覆写 static 方法或非虚方法; 3. 方法、属性、索引和事件都可以被声明为 virtual override

 

4.       使用基类的引用调用被覆写的虚方法意味着使基类引用的访问权“提升至”派生类内,直到继承层次中被标记为 override 最高派生级别版本 ,如果在更高的派生级别还有该方法的其他声明,但没有被标记为 override ,则它们不会被调用

 

5.       派生类只能 override 所在的继承层次中直接 父类的 被标记为 virtual override abstract 的成员。

 

6.       执行构造函数时编译器首先执行基类 的构造函数,以此类推执行到 System.Object 类为止,当前类的构造函数是最后被执行 。当一个对象被创建 ( 分配内存 ) 后,首先初始化对象的所有实例成员 然后是一系列构造函数的执行

 

7.       不推荐在构造函数中调用虚方法,因为这有可能会导致在派生类完全初始化之前 调用派生类的覆写方法

 

8.       当对象被构造时,基类的无参 构造函数被调用,可以在构造函数初始化语句中使用 base 来指定使用一个特定 的基类构造函数而不是基类的无参构造函数;还可以通过 this 来指定本类中另一个构造函数 进行初始化,但无论 base 还是 this 括号里面的参数列表都应该和相应的构造函数参数列表相对应。注意 :即便使用了 this ,构造函数的执行仍旧是逐级递推到 Object 然后反向逐一执行,还有, this base 不能同时修饰一个构造函数。

 

9.       类的访问级别只有 public internal ,默认为 internal ,除非在类声明中显示地指定为 public ,程序集外部的代码不能访问该类,标记为 public 的类可以被系统中任何程序集中的代码访问。

 

10.   C# 允许从在不同的程序集 ( 项目 ) 中定义基类和派生类 ( 注意程序集修改后要重新编译或重新生成解决方案 ) ,应满足:基类必须声明为 public ,必须在 Visual Studio 工程中添加对包含该基类的程序集的引用。注意:添加程序集引用是告诉编译器所需的类型在哪里被定义 ,但增加 using 指令允许你引用此程序集中其他的类而不必使用他们的完全限定名

 

11.   基类的 private 成员不能被继承,类中的每个成员都必须指定成员访问级别,若不显式指定,则隐式为 private ,另外,若一个 的访问性限于它所在的程序集 ( 即为 Internal) ,那么类的成员也被不能在程序集的外部被访问,无论它们的访问修饰符是什么

 

12.   任何类的 private 成员只对它自己的类或它的嵌套类的成员可见。标记为 internal 的成员对同一程序集内部的任何类 的成员可见,但对程序 外部 的类不可见。 protected internal protected internal 并集 ,而非交集。 ( 详见 P127 的表 7-2)

 

13.   抽象成员的实现由分号代替 ,在派生类的实现中必须被 override 修饰,并且只能被声明在抽象类中。能被声明为 abstract 的成员有方法、属性、事件、索引。

 

14.   抽象 (abstract) 类是用来被继承的,它可以派生自另一个抽象类,任何派生自抽象类的类必须使用 override 实现该类所有 抽象 成员,否则派生类也必须是抽象类,即类中有一个抽象成员就须声明为抽象类 ,一个抽象类可以包含抽象成员 也可以包含普通带实现的实例成员

 

15.   密封 (sealed) 类只能用作独立的类,不能被继承。

 

16.   静态 (static) 类中的所有成员必须 是静态的,不能继承静态类,它们是密封的 静态类可以有一个静态 构造函数,但不能有实例 构造函数,和抽象类相同,不能创建静态类的实例

 

17.   C# 3.0 增加了扩展方法允许在保持原有类型不做任何改变的情况下,对相同或不同的程序集内的方法进行扩展,从而可以从容地对第三方程序集进行扩展,并能在原有类型的实例自身上调用该方法。

 

18.   扩展方法必须声明在非泛型或非嵌套的静态类 中,本身必须为 static ,必须包括 this 作为它的第一个参数类型,并在后面跟着它所要扩展的类的名称。另外,扩展可以被继承 ,对 System.Object 的扩展将能被所有类型继承。

 

19.   外部方法是在声明中没有实现并由分号代替实现的方法,实现多是由 C# 之外的语言编写,须有 static extern 修饰符,方法的实现通常由 DllImport 特性引入,通常它包含所引用的外部方法的动态连接库的位置。要使用 DllImport 特性必须要 using System.Runtime.InteropServices; 这个特性可以让我们调用非托管代码,可以使用 DllImport 特性引入对 Win32 API 函数的调用。

 

20.    抽象类也有构造函数 ,如果我们自己没有定义的话,编译器会为我们生成一个默认的构造函数。若不提供访问限定符,则默认为protected 访问级别。这样设计是因为抽象类需要被其他类继承,而这些子类需要被实例化,实例化子类时需要调用子类的构造函数,而在默认情况下,调用子类构造函数前先要调用基类的构造函数的,非常类似于非抽象类。另外,子类在实例化时:只会调用所有父类的无参 构造函数,含参构造函数只能显式被调用 。这种情况并不局限于抽象类,也适用于所有继承情况。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值