第四章 继承

1、实现继承:表示一个类型派生于一个基类型,拥有该基类型的所有成员字段和函数。接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码。

2、结构并不支持实现继承,但支持接口继承。

3、C#并不支持私有继承。

4、把一个基类函数声明为virtual,该函数就可以在在任何派生类中重写了,也可以把属性声明为virtual。在C#中,函数在默认情况下不是虚拟的,但可以显式地声明为virtual。而在Java中,所有的函数都是虚拟的。C#要求在派生类的函数重写另一个函数时,要使用override关键字显式声明。成员字段和静态函数都不能声明为virtual,因为这个概念只对类中的实例函数成员有意义。

5、如果签名相同的方法在基类和派生类中都进行了声明, 但该方法没有声明为virtual和override,派生类方法就会隐藏基类方法。在C#中,应使用new关键字声明我们要隐藏一个方法,否则会发出一个警告。

6、抽象函数也是虚拟的,但不需提供virtual关键字,实际上,提供了该关键字,就会产生一个语法错误。如果类包含了抽象函数,则这个类将也是抽象的,必须声明为抽象的。抽象类可以继承非抽象类。

7、C#允许把类和方法声明为sealed,对于类来说,这表示不能继承该类, 对于方法来说,这表示不能重写该方法。sealed相当于Java中的final。string类是一个密封类。

8、不能把类型定义为protected、internal和protected internal,因为这些修饰符对于包含在命名空间中的类型来说是没有意义的。因为这些修饰符只能应用于成员。但可以用这些修饰符定义嵌套的类型,因为在这种情况下,类型也具有成员的状态。如果有嵌套的类型,内部的类型可以访问外部类型的所有成员,甚至可以访问私有成员。internal与public类似,但访问仅限于同一个程序集中的其他代码,即在同一个程序中同时编译的代码。 protected internal 合并了protected和internal,但这是一种OR合并,而不是AND合并。protected internal 成员在同一个程序集的任何代码中都可见,在派生类中也可见,甚至在其他程序集中也可见。

9、一般情况下,接口中只能包含方法、属性、索引器和事件的声明。接口不能有构造函数或字段。接口定义也不能包含运算符重载,不允许声明成员上的修饰符。接口成员总是公共的,不能声明为虚拟或静态。foreach循环的内部工作方式是查询对象,看看它是否实现了System.Collections.IEnumerable接口,如果是,C#编译器就插入IL代码,使用这个接口上的方法迭代集合中的成员。IEnumerable和IDisposable在某种程度上都是有点特殊的接口,因为它们都可以由C#编译器识别,在C#编译器生成的代码中会考虑它们。显然,自己定义的接口没有这种特权。

10、静态方法和静态变量可以继承,但对静态变量的操作将影响派生类与基类。如以下输出为:A B

      public class A
    {
        public static string s="A";
    }
    public class B:A
    {
    }

    class Program
    {
         static void Main(string[] args)
         {

              Console.WriteLine(B.s);
              B.s = "B";
              Console.WriteLine(A.s);
         }

    }

posted @ 2011-02-11 22:59  涂墨留香  阅读(220)  评论(0编辑  收藏  举报