精讲C#中的要点ppt课件.ppt
第九章第九章 定义类定义类 面向对象程序设计(C#)主要内容n类定义相关语法类的定义构造函数与析构函数n其它相关主题面向对象程序设计(C#)类的定义类的定义n使用class关键字来定义类:class / 类的成员类的成员 面向对象程序设计(C#)类的成员(Member)的定义n成员的访问限定符n数据成员(字段)的定义n函数成员(方法)的定义n构造函数与析构函数的定义n属性(方法)的定义面向对象程序设计(C#)类定义中可以使用的访问修饰符修饰符含义无或internal类只能在当前项目中访问public类可以在任何地方访问abstract或internal abstract类只能在当前项目访问,不能实例化,只能继承public abstract类可以在任何地方访问,不能实例化,只能继承sealed或internal sealed类只能在当前项目中访问,不能派生,只能实例化public sealed类可以在任何地方访问,不能派生,只能实例化面向对象程序设计(C#)成员访问(Accessibility)限定符npublic: Member is accessible from any code;nprivate: Member is accessible only from code that is part of the class (the default if no keyword is used);ninternal: Member is accessible only from code within the project (assembly) where it is defined;nprotected: Member accessible only from code that is part of either the class or a derived class;nProtected internal面向对象程序设计(C#)数据成员(Field)的定义nclass ;n其他修饰符其他修饰符: static 、 readonly、 const、 volatile面向对象程序设计(C#)Modifiernstatic:表示类的静态字段,可通过定义它们的类来访问,不能用对象实例访问。nreadOnly:表示这个字段只能在执行构造函数的过程中赋值,或由初始化赋值语句赋值。面向对象程序设计(C#)ModifiernConst: 指定字段或局部变量的值是常数,不能被修改nVolatile:类型修饰符(type specifier),被设计用来修饰被不同线程访问和修改的变量;面向对象程序设计(C#)数据成员(Field)的初始化n在数据成员的定义语句中进行初始化;运行时初始化(类的新对象被创建时);可用于静态数据成员的初始化方法;n在实例构造函数(Constructors)中初始化;(推荐)面向对象程序设计(C#)函数成员(Method)的定义nclass 函数体函数体 n其他修饰符其他修饰符Static:只能通过类访问,无法通过对象实例访问;只能通过类访问,无法通过对象实例访问;Virtual:方法可以重写:方法可以重写Abstract:方法必须在非抽象的派生类中重写(只用于方法必须在非抽象的派生类中重写(只用于抽象类)抽象类)override (sealed):方法重写了一个基类方法(如果方方法重写了一个基类方法(如果方法被重写,就必须使用该关键字)法被重写,就必须使用该关键字)Extern:方法定义放在其他地方:方法定义放在其他地方面向对象程序设计(C#)构造函数与析构函数(Constructors and Destructors) n构造函数与析构函数是类的两种特殊的函数成员,分别用于对象的初始化和清理。n构造函数要求与所在的类同名,无返回值,如:面向对象程序设计(C#)构造函数与析构函数(Constructors and Destructors)n构造函数允许重载,如果在代码中没有提供,编译器会自动添加一个默认的构造函数。n而析构函数使用带有前缀的类名来声明,无参无返回值。如:析构函数不允许重载。面向对象程序设计(C#)静态构造函数n静态构造函数在以下情形下被自动调用:对应类的第一个实例被创建时;对应类的任何一个静态成员第一次被引用时。n静态构造函数用于初始化类的静态成员。面向对象程序设计(C#)关于FinalizenFinalize方法允许方法允许 Object 在在“垃圾回收垃圾回收”回收回收 Object 之之前尝试释放资源并执行其他清理操作。前尝试释放资源并执行其他清理操作。n默认情况下,默认情况下,Object.Finalize 不执行任何操作不执行任何操作。只有在只有在必要时才必须由派生类重写它。派生类型中的每个必要时才必须由派生类重写它。派生类型中的每个 Finalize 实现都必须调用其基类型的实现都必须调用其基类型的 Finalize 实现。这是实现。这是唯一一种允许应用程序代码调用唯一一种允许应用程序代码调用 Finalize 的情况。的情况。 nc# 析构函数是执行清理操作的析构函数是执行清理操作的 C# 机制。析构函数提供机制。析构函数提供了适当的保护措施,如自动调用基类型的析构函数。在了适当的保护措施,如自动调用基类型的析构函数。在 C# 代码中,不能调用或重写代码中,不能调用或重写 Object.Finalize。面向对象程序设计(C#)类的属性(Property)的定义nclass get 读取属性值部分函数体读取属性值部分函数体 set 设置属性值部分函数体设置属性值部分函数体 n属性实际上实现了属性实际上实现了OOP的封装性的封装性面向对象程序设计(C#)类的属性(Property)的定义n只读/只写属性n自动完成属性(C#3.0)面向对象程序设计(C#)类的属性(Property)的定义面向对象程序设计(C#)类的属性(Property)的定义面向对象程序设计(C#)比较OOP与非OOP面向对象程序设计(C#)比较OOP与非OOP面向对象程序设计(C#)类定义中的访问修饰符类定义中的访问修饰符面向对象程序设计(C#)内部类与公共类n在默认情况下,不加修饰符或显式使用internal关键字来定义内部类内部类。内部类只允许被同一个项目中的代码访问。n要让其他项目中的代码来访问,必须使用关键字public,即定义为公共类公共类。面向对象程序设计(C#)注意以下代码将不能编译ninternal class MyBase / Class members. public class MyClass : MyBase / Class members. 面向对象程序设计(C#)类的继承-派生类的定义n定义派生类的语法结构如下:class : / 派生类特有的成员派生类特有的成员 nC#不支持不支持多重继承,即:在C#中,一个类至多只能有一个基类一个类至多只能有一个基类。面向对象程序设计(C#)基类成员在派生类中的可访问性在基类中的在基类中的可访问性可访问性在派生类中的在派生类中的可访问性可访问性private(inaccessible)publicpublicprotectedprotected面向对象程序设计(C#)protected关键字nprotected 关键字是一个成员访问修饰符。受保护成员在它的类中可访问并且可由派生类访问。n注意,只有在通过派生类类型发生访问时,基类的受保护成员在派生类中才是可访问的。 面向对象程序设计(C#)面向对象程序设计(C#)派生类对象的实例化n为了实例化派生类,必须首先实例化它的基类部分。以此递推,最先被实例化的应该是System.Object类。n从本质上看,要创建派生类的对象,首先应通过调用基类的构造函数完成对由基类由基类继承而来的数据成员的初始化继承而来的数据成员的初始化,然后再执行自身的构造函数完成本类扩展成员的初始化。面向对象程序设计(C#)面向对象程序设计(C#)派生类对象的实例化n默认情形下,会依次调用以下构造函数1、System.Object.Object() 2、MyBaseClass.MyBaseClass() 3、MyDerivedClass的构造函数具体调用的重载版本取决于以何种方式来实例化MyDerivedClass (new语句语句)面向对象程序设计(C#)派生类对象的实例化n如果希望被调用的不是基类的默认构造函数(即无参版本),则可以使用构造函数初始化器构造函数初始化器,它会先于所在的构造函数被执行,格式如下:public DerivedClass(paramlist1): base(paramlist2) n其中,base关键字用于指代当前实例对应的基类对象,从而调用基类的对应构造函数。面向对象程序设计(C#)派生类对象的实例化n构造函数初始化器还可以使用this关键字,实现在调用指定的构造函数前,先调用其他非默认的构造函数。n实际上默认的派生类构造函数等价于:public MyDerivedClass(): base() 面向对象程序设计(C#)派生类对象的析构n考虑一个当一个派生类对象将要被销毁时,其析构函数的调用顺序?面向对象程序设计(C#)试一试n类的继承结构面向对象程序设计(C#)VS2008中的OOP工具n类视图n类视图中的图标n对象浏览器面向对象程序设计(C#)类视图(Class View)面向对象程序设计(C#)类视图中的图标面向对象程序设计(C#)对象浏览器(Object Browser )面向对象程序设计(C#)类图(Class Diagrams) n往项目中添加新类n创建类图面向对象程序设计(C#)结构类型n类与结构非常相似,但结构是值类型,类是引用类型。n结构成员无法受保护,因为无法继承结构。