c#入门经典笔记第九章

一、如何在C#章定义类和接口

1、默认下,类声明为内部的,只有当前项目中的代码能访问它,可以使用internal访问修饰符关键字显式指定(但不必要)。使用public指定类可以由其他项目中的代码来访问。

  public class MyClass{//Class members.}

  还可以指定为抽象的(不能实例化,只能集成)或密封的(sealed,不能继承)。

  abstract/sealed class MyClass{...},它们可以是公共或内部的。

2、指定继承的方式为: public class MyClass : MyBase{}

  在c#的类定义中,只能有一个基类,如果继承了一个抽象类,就必须实现所继承的所有抽象成员(除非派生类也是抽象的)。

  编译器不允许派生类的可访问性高于基类。下述代码不能编译:

  internal class MyBase{...}

  public class MyClass : MyBase{...}

  如果没有使用基类,则被定义的类就只继承与基类System.Object

3、还可以在冒号之后指定支持的接口,如果指定了基类,它必须紧跟在冒号的后面,使用逗号分隔基类名和接口名。

  所有接口成员都必须在支持该接口的类中实现,如果不想使用给定的接口成员,可以提供一个”空“的实现方式(没有函数代码),还可以把接口成员实现为抽闲类中的抽象成员。

  可以继承多个接口。

4、接口的定义。

  interface IMyInterface{...}

  接口默认为内部的,如果要公开访问,必须使用public关键字。

  接口中不能使用关键字abstract和sealed。

  接口可以使用和类继承类似的方式。区别是可以继承多个基接口

 

二、如何使用控制可访问性和集成的关键字

三、System.Object类及其在类定义中的作用

1、System.Object提供的析构函数叫作Finalize(),自己声明时用带有~前缀的类名来声明。在调用这个析构函数后,还将隐式地调用基类的析构函数,包含Finalize()的调用,

2、构造函数的执行序列。默认情况下,无论派生类上使用什么样的构造函数,除非明确指明,否则使用基类的默认构造函数,

3、使用构造函数初始化器,它把代码放在方法定义的冒号后面。

  考虑下面的对象层次结构

  public class MybaseClass

  {

    public MyBaseClass(){}

    public MyBaseClass(int i){}

  }

  public class MyDerivedClass : MyBaseClass

  {

    public MyDerivedClass(){}

    public MyDerivedClass(int i){}

    public MyDerivedClass(int i,int j){} 

  }

  可以在派生类的构造函数定义中指定所使用的基类构造函数,

  public class MyDerivedClass(): MyBaseClass

  {

    public MyDerivedClass(int i, int j) : base(i){}

  }

  base关键字指定.NET 实例化过程使用基类中有指定参数的构造函数。这里使用了一个int参数(其值通过参数i传送给MyDerivedClass构造函数),所以应使用MyBaseClass(int i)。这么做将不调用MyBaseClass()。

  还可以使用base指定基类构造函数的字面值,例如使用MyDerivedClass的默认构造函数调用MyBaseClass非默认的构造函数。

  public MyDerivedClass : MyBaseClass

  {

    public MyDerivedClass():base (5){}

  }

还可以使用this关键字,指定在调用指定的构造函数之前,.NET 实例化过程对当前类使用非默认的构造喝酸奶。如

  public class MyDerivedClass : MyBaseClass

  {

    public MyDerivedClass():this(5,6){}

    public MyDerivedClass(int i,int j):base(i)

  }    

上段代码将会执行下述序列

  执行System.Objec.Object()构造函数

  执行MyBaseClass.MyBaseClass(int i)的构造函数

  执行MyDerivedClass.MyDerivedClass(int i, int j)构造函数

  构造函数初始化器只能指定一个构造函数,但仍可以构造相当复杂的执行序列。

  如果没有给构造函数指定构造函数初始化器,编译器就会自动添加base()。这会执行本节前面介绍的默认序列。

四、如何使用VS和VCE提供的一些帮助工具

1、Class View窗口(类视图)

2、对象浏览器

3、添加类

4、类图。

五、如何定义类库

1、类库项目。除了在项目中把类放在不同的文件夹中,还可以把它们放在完全不同的项目中,如果一个项目什么都吧包含,只包含类(以及其他相关的类型定义,但没有入口点),该项目就成为类库。类库项目编译为.dll程序集,在其他项目中添加对类库项目的引用,就可以访问它的内容,

六、接口和抽象类的异同

  1、相同点:都可以包含由派生类继承的成员,接口和抽象类都不能直接实例化,但可以声明这些类型的变量,这样就可以使用多态性把继承这两种类型的对象指定给它们的变量,接着通过这些变量来使用这些类型的成员,但不能直接访问派生对象的其他成员。

  2、区别:派生类只能直接继承一个抽象类(但可以用一个继承链包含多个抽象类),类可以使用任意多个接口。这两种情况取得的效果是类似的。

  抽象类可以有抽象成员(没有代码体,且必须在派生类中实现,否则派生类本身必须也是抽象的)和非抽象成员(它们拥有代码体,也可以是虚拟的,这样就可以在派生类中重写)。而接口成员必须都在使用接口的类上实现,  它们没有代码体,另外接口成员是公共的。但抽象类的成员可以是私有的(只要不是抽象的)、受保护的、内部的、或受保护的内部成员(受保护的内部成员只能在应用程序的代码或派生类中访问),此外接口不能包含字段、构造函数、析构函数

静态成员或常量。

  抽象类主要用作对象系列的基类,共享某些主要特征,接口则主要用于类,这些类在基础水平上有所不同,但仍可以完成某些相同的任务。

七、结构类型的更多内容

结构是值类型,类是引用类型。

八、复制对象的一些重要信息

从一个变量到另一个变量按值复制对象,而不是按引用复制对象,可能非常复杂,因为一个对象可能包含许多其他对象的引用。.NET Framework中简单地按照成员复制对象可以通过派生于System.Object的MemberwiseClone()方法来实现。这份方法提供的复制功能成为浅复制(shallow copy),因为他没有考虑引用类型成员,因此,新对象中的引用成员就会指向与源对象中相同成员的对象。如果要创建成员的新实例(复制值,而不是引用),需要用到深度复制(deep copy)

  

 

posted @ 2013-10-01 18:08  w-l  阅读(411)  评论(0编辑  收藏  举报