面向对象的C.ppt

上传人:本田雅阁 文档编号:3227727 上传时间:2019-08-02 格式:PPT 页数:42 大小:458.54KB
返回 下载 相关 举报
面向对象的C.ppt_第1页
第1页 / 共42页
面向对象的C.ppt_第2页
第2页 / 共42页
面向对象的C.ppt_第3页
第3页 / 共42页
面向对象的C.ppt_第4页
第4页 / 共42页
面向对象的C.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《面向对象的C.ppt》由会员分享,可在线阅读,更多相关《面向对象的C.ppt(42页珍藏版)》请在三一文库上搜索。

1、第6章 面向对象的C#,从本章开始进入C#面向对象编程。C#是一门面向对象的语言,面向对象是C#最基本的特征。深入了解C#面向对象,对进入面向对象程序开发具有很大的帮助,对学习其他面向对象的语言具有事半功倍的作用,本章主要涉及到的知识点有: 了解面向对象的概念。 理解System.Object类,以及C#框架类库。 定义类和实例化对象。 理解类的成员,属性和方法。 使用集合类和泛型。,6.1 面向对象基础,面向对象技术最早出现在60年代,在90年代发展成熟,并成为主流编程方法。面向对象强调类的“封装”、“继承”、“多态”等思想,同时强调定义类之间的层次关系,以及这些关系的实质。就像现实世界一样

2、,让程序更易于理解和设计。,6.1.1 什么是面向对象,OOP(Object Oriented Programming),即面向对象程序设计。面向对象编程就是为了更直观的描述现实世界,这里的“对象”跟现实世界中的实体有类比之处,在程序中,所谓“对象”就是一个或一组数据以及处理这些数据的方法和过程的集合。面向对象的程序设计完全不同于传统的面向过程程序设计,它更直观地模拟人的认知思维,大大地降低了软件开发的难度,彻底地影响了软件编程世界。 面向对象编程是一种计算机编程架构。图6.1是对OOP的描述,OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息

3、、处理数据和向其他对象发送信息。,6.1.2 面向对象的特征,面向对象中的类(class)是最基本的C#类型,类是将状态和操作组织在一个单元中的一种机制,通过类,可以动态创建不同值的实例,即对象,以此创建出丰富多彩的面向对象世界,其中面向对象的编程主要体现在以下的特征: 组件:能够完成某些功能的模块化、结构化的程序单元。 抽象性:程序只关注重要细节,忽略次要细节的过程。 封装:将东西包装在一起,然后以新的完整形式呈现出来,将实现细节隐藏,不让用户看到,以保证完整性。 多态性:多态性是不同的实例对象以不同的方式对相同的信息做出不同的表现。组件的引用和类集,会涉及到其他许多不同类型的组件,而且引用

4、组件所产生的结果得依据实际调用的类型。 继承性:允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性,同时达到了重用性。,6.2 万物皆对象,程序本身的目的就是为了描述现实的,把现实的事物描述出来,把事物之间的业务逻辑设计清楚,能够易于人的理解,能够为人们服务,就是程序。在面向对象的程序里,万物皆对象。,6.2.1 怎么理解“对象”,什么是对象呢?人、桌子、汽车、大象这些都是对象。概括地说,现实中一切存在的实体,都是对象。比如说人,人具有姓名、性别、高矮胖瘦等特征,人还具有走路、吃饭、唱歌等行为,这些特征和行为都是可以描述的。把它们归纳起来,就可以描述一个具体的人对象。所以,可以这

5、样定义对象:“对象是存在的具体实体,具有明确定义的状态和行为”。,6.2.2 从对象到类,首先来看一个例子,如图6.2所示,分别描述两个不同的明星,他们都有姓名、职衔、出生和身高等状态,但是状态的值是各不一样的,如罗纳尔迪尼奥是球员,出生于1980年,身高181厘米;布兰妮是歌手,出生于1981年,身高163厘米。他们也具有不同的行为,罗纳尔迪尼奥可以踢球,布兰妮可以唱歌。,6.2.3 定义类,类是C#中功能强大的数据类型,像结构一样,类可以定义数据的状态和行为。使用类声明可以创建新的类。类声明以一个声明头开始,其组成方式如下:先指定类的属性和修饰符,然后是类的名称,接着是基类(如有)以及该类

6、实现的接口。声明头后面跟着类体,它由一组位于一对大括号和之间的成员声明组成。下面是一个类声明的语法结构: class : /类成员 ,6.2.4 构造类,【本节示例参考:源代码chapter66.2.4ClassPropertyExample】 类通过构造方法来提供实例化调用,构造方法是只要在创建给定类的对象时就调用的一个方法,它们与类同名,但不具备任何返回类型。每个类都有一个默认的不带参数的构造方法,如下是定义的“Person”类显示的声明默认构造方法。 class Person private string name = string.Empty; /定义类的字段 public Perso

7、n() /显示声明默认构造方法 Console.WriteLine(“默认构造方法“); static void Main(string args) /主函数调用 Person person = new Person(); /实例化对象 ,6.2.5 类的成员,对象的状态和行为都是通过类的成员定义的,类的成员或者是静态成员,或者是实例成员。静态成员用关键字static修饰,属于类;实例成员属于对象。如表6.1提供了类所能包含的成员种类的概述。,6.2.6 定义类的字段,【本节示例参考:源代码chapter6 6.2.6ClassPropertyExample】 在C#里,通过字段(field)

8、来描述对象的特征,字段是类的构成部分,它使类可以封装数据。如罗纳尔迪尼奥和布兰妮都具有姓名、职衔、出生和身高等特征。如下代码给类Person定义了两个字段,一个表示姓名,一个表示年龄: class Person private string name; /姓名 private int age; /年龄 ,6.2.7 定义类的方法,【本节示例参考:源代码chapter6 6.2.7ClassFunctionExample】 “方法”是为了实现某个功能的一系列语句的代码块,类中的方法跟函数类似,但方法仅仅在类中定义。首先来看一下方法的定义: public static void SayHello(

9、) Console.WriteLine(“Hello!”); 该方法由以下几部分组成: (1)public访问修饰符:用于设定该方法的访问权限,可以省略,6.3.5节会重点讲解。 (2)static关键字:用于表示是静态成员,可以省略。6.3.6节会重点讲解。 (3)void关键字:用于表示方法的返回值类型,void表示没有返回值。 (4)方法名SayHello:方法的惟一标识。 (5)参数列表():为空表示没有参数,可以包含一个或多个各种数据类型的参数。 (6)功能代码块 :方法体,用于实现方法的功能。,6.2.8 从类到对象,定义好类以后,就可以通过类实例化对象。对象的实例化语法如下: P

10、erson aPerson =new Person(); 其中,Person是类名,aPerson是对象名,通过new关键字调用默认的构造方法Person()。在C#中,Person只是定义的一个数据类型,通过new实例化对象的过程,就是给对象分配内存空间的过程。也可以通过带参构造方法实例化对象,如: Person aPerson =new Person(“Kenrome”); 也可以把对象的实例化分为两步,如: Person aPerson; aPerson=new Person(“Kenrome”);,6.2.9 类和对象程序实例,【本节示例参考:源代码chapter6 6.2.9Clas

11、sTest】 在本节中,从概念到程序,逐一学习了类、类的定义、类的字段、类的方法、类的构造以及类的实例化。最后,通过一个完整的例子来综合理解本节的内容。这个例子定义了一个类Person,在类里定义了两个构造函数和一个方法。然后实例化这个类,调用它的方法通过这个例子,读者可以梳理一下所学到的类中的概念。 新建一个名为“ClassTest”的控制台应用程序,并添加一个名为“Person.cs”的文件,给该文件添加代码如6-5所示。,6.3 用对象思考:类的成员,要描述一个对象,往往从两方面入手,一是描述对象所具有的状态,二是描述对象所能完成的操作。一般情况下,字段和属性表示对象的状态,而方法表示对

12、象可以采取的操作。本节的主题描述将属性、字段和方法添加到类的机制及处理与这些项关联的问题。,6.3.1 定义类的属性,【本节示例参考:源代码chapter6 6.3.1PropertyTest】 C#通过属性来读取、编写或计算私有的字段的值。属性相当于对字段访问的封装。通常,属性包括get和set的代码块,get用于读取字段的值,set用于设置字段的值。代码6-7给类Person定义了两个属性,一个用于封装姓名字段,一个用于封装身高字段。,6.3.2 属性和字段的区别,【本节示例参考:源代码chapter6 6.3.2PropertyTest】 属性跟字段有什么区别呢?属性是类中可以像类的字段

13、一样访问的方法。属性可以为类字段提供保护,避免字段在对象不知道的情况下被更改。属性具有多种用法:它们可在允许更改前验证数据;它们可透明地公开某个类上的数据,该类的数据实际上是从其他源(例如数据库)检索到的;当数据被更改时,它们可采取行动,例如引发事件或更改其他字段的值。,6.3.3 命名规则,在计算机编程中,经常用到的命名规则主要有驼峰命名法、帕斯卡命名法和匈牙利命名法。 (1)驼峰(Camel)命名法:正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字,C#中的字段建议采用该命名法(这里所指的是小骆驼式命名法),如: string userName; int userId

14、; (2)帕斯卡(Pascal)命名法:与驼峰命名法类似。只不过骆驼命名法是首字母小写,而帕斯卡命名法是首字母大写,C#中的属性和方法建议采用帕斯卡命名法,如: string UserName; int UserId; DisplayInfo(); SayHello(); (3)匈牙利命名法:广泛应用于象Microsoft Windows这样的环境中。Windows编程中用到的变量、宏的命名采用的是匈牙利命名法,匈牙利命名的标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。如: int iSize; string sUser

15、Name;,6.3.4 this关键字,【本节示例参考:源代码chapter6 6.3.4ThisTest】 this关键字用在类中,用于访问该类的成员。当类实例化后,this代表被实例化的对象。代码6-9展示了this关键字的用法。,6.3.5 类成员的访问,类的每个成员都有关联的可访问性,它控制能够访问该成员的程序文本区域。有五种可能的可访问性形式。表6-2概述了这些可访问性。,6.3.6 静态类和静态成员,【本节示例参考:源代码chapter6 6.3.6StaticTest】 在第5章讲数组的时候,用Array类的Sort()方法作排序,如: int numbers = 3, 5, 2

16、, 4, 1 ; /定义数组 System.Array.Sort(numbers); /开始排序 读者会发现Array类在调用Sort方法的时候,并没有对类实例化,读者再看一下Sort方法的声明: public static void Sort(Array array); 这是因为static关键字在起作用。static修饰的类的成员属于静态成员,静态成员是属于类本身,而不是属于对象的成员。static修饰符可用于类、字段、方法、属性、运算符、事件和构造方法,但不能用于索引器、析构函数或类以外的类型。,6.3.7 析构函数,【本节示例参考:源代码chapter66.3.7Destruction

17、FunctionTest】 C#提供很好的垃圾回收机制,很多垃圾回收的工作是由.NET Framework来完成的,不需要程序员的干预。同时,C#也提供了析构函数,用于回收对象中无用的资源。C#中一个类只能有一个析构函数,并且无法调用析构函数,因为它是被自动调用的。析构函数采取如下的定义方式: class MyClass /析构函数 MyClass() /以“”开头 /析构函数的实现代码 ,6.4 理解System.Object类,老子曰:“道生一,一生二,二生三,三生万物”,这是对天下万物的理解,意思就是万事万物都在不断的派生和演化,以至于演变了绚丽多彩的大千世界。但是万物不论如何演化,其中

18、都存有最原始的“道”。万物归宗,在面向对象的C#中,又是如何来体现这个原始的“道”的呢?这就是System.Object类。,6.4.1 万物归宗,【本节示例参考:源代码chapter6 6.4.1ObjectExample】 System.Object类是所有类的基类,.NET中所有的类都派生于System.Object。实际上,如果在定义类时没有指定基类,编译器就会自动假定这个类派生于Object(对于结构,这个派生是间接的:结构总是派生于System.ValueType,System.ValueType派生于System.Object)。 这样子设计有什么好处呢?Object类本身提供了

19、许多公共的成员方法,在C#中定义的类都可以引用这些成员方法,达到重用性和统一性。同时,正因为所有的类都默认地继承Object类,这使得类之间可以发送消息,产生关联。,6.4.2 Object类的应用,【本节示例参考:源代码chapter6 6.4.1ObjectExample】 最后通过一个例子来演示Object类提供的常用方法的返回结果。该类定义了一个整数i,然后调用该整数继承自Object类的方法完成一系统操作。如代码6-12所示。,6.5 体验C#框架类库的强大功能,在本书第1章中展示了.NET Framework强大的框架类库。由.NET Framework类库提供的内容,构成了.NE

20、T应用程序的核心功能。框架类库中有数量庞大的命名空间和类,为程序开发提供了很大方便。,6.5.1 体验框架类库强大的功能,【本节示例参考:源代码chapter6 6.5.1FCLExample】 首先,通过一个例子来体验一下,到底框架类库为我们提供了多大的方便。网络上经常提供下载的功能,下面的程序实现将网上一个已知路径的图片下载,并保存到本地。程序如代码6-13所示。,6.5.2 框架类库中的命名空间,在使用框架类库的时候,我们会引用相应的命名空间(如上面的例子,因为要用到网络操作,所以引入网络相关命名空间System.Net),在类库中包含170多个命名空间,将框架类库的内容组织成一个树状结

21、构。每个命名空间可以包含许多类型和其他命名空间。如图6.9展示了.NET框架类库的部分命名空间。,6.5.3 命名空间的定义,框架类库中的类是通过命名空间来组织的,当需要引用类的时候,就通过using关键字引入命名空间。 C#中命名空间起到了合理组织类的作用,命名空间只是一个逻辑上的文件组织结构,它允许所组织的类文件的物理位置与逻辑结构不一致。定义命名空间使用关键字“namespace”。语法如下: namespace Model /定义名为Model命名空间 class User /定义命名空间中的类 /类中实现代码 class Admin /定义命名空间中的类 /类中实现代码 ,6.5.4

22、 命名空间的使用,在程序的开头引用命名空间,在程序中就可以使用该命名空间中的内容了,如图6.10所示。 C#通过using关键字引用命名空间,例如:using System、using Model.Users。如果引入一个命名空间,就意味着引入命名空间中的所有内容了。 注意:如果在程序开始之前没有通过using关键字引用命名空间,则可以在程序中直接通过“.”符号引用类。例如,Model.Users中有个类Admin,则可以这样引用: Model.Users.Admin admin = new Model.Users.Admin(); 如果命名空间的嵌套非常多,还可以通过指定别名来引用命名空间,

23、如图6.11所示。,6.6 使用集合类,在第5章讲到的数组能够同时存储多个相同数据类型的数据,如果将紧密相关的数据组合到一个集合中,则能够更有效地处理这些相关的数据,集合就是一组组合在一起的类似的类型化对象。C#框架类库提供了丰富的集合操作类,本节将带领读者依次学习几个常用集合类:ArrayList、Queue、Stack和HashTable。,6.6.1 动态数组:ArrayList类,【本节示例参考:源代码chapter6 6.6.1ArrayListExample】 ArrayList是C#中比较高级的集合操作类,我们可以认为ArrayList是负责的数组,即在数组的基础上添加了一些通用

24、的操作,扩充了数组的功能。下面分任务学习ArrayList类。 1向ArrayList中添加元素 ArrayList提供了Add和Insert两个方法用于添加元素。 2向ArrayList中删除元素 ArrayList提供了Clear、Remove和RemoveAt三个方法用于删除元素。 3遍历ArrayList 中的元素 可以使用与数组相同的方式对ArrayList进行遍历,即foreach。,6.6.2 先进先出的队列:Queue类,【本节示例参考:源代码chapter6 6.6.2QueueExample】 Queue是先进先出的集合类,Queue译为队列。队列的特性是一端进,一端出,即

25、先进入队列的元素将会先从出口出来,图6.12展示了队列的特性。 队列往往有入队和出队的操作,下面将逐一介绍队列的操作。 1入队 2出队,6.6.3 后进先出的栈:Stack类,【本节示例参考:源代码chapter6 6.6.3StackExample】 Stack是另外一个重要的集合类,它的功能跟Queue相似。Stack被翻译为堆栈,是一个后进先出的集合类,即最后添加的元素将最先出来,图6.13展示了堆栈的原理。 堆栈主要具有进栈和出栈操作,下面逐一介绍堆栈的操作。 1入栈 Stack提供的Push方法向堆栈顶部插入一个元素。 2出栈 Stack提供的Pop方法向堆栈顶部移除一个元素。如果只

26、希望获得堆栈顶部的元素,而不将其从Stack上移除,则使用Stack的Peek方法。,6.6.4 字典:HashTable类,【本节示例参考:源代码chapter6 6.6.4HashTableExample】 HashTable又称为哈希表,表示键(key)/值(value)对的集合,这些键值对根据键的哈希代码进行组织,每一个元素都是一个存储在字典实体对象中的键/值对。HashTable像一个字典,根据键可以找到相应的值。哈希表提供了添加元素和访问元素等方法,下面逐一介绍常用的对哈希表的操作。 1. 构造哈希表 2. 删除哈希表元素 3. 遍历哈希表,6.7 使用泛型和泛型集合,C#提供了众

27、多的集合类供程序员使用,同时C#2.0提供了一个新特性泛型。通过泛型类能够更好更安全的操作元素。微软也非常重视泛型的使用,而且从C#2.0开始,如果创建一个类,程序会自动引入泛型的命名空间System.Collections.Generic。也就是说,如果要使用集合,可以更多的选用泛型集合。,6.7.1 解决ArrayList类带来的问题,【本节示例参考:源代码chapter66.7.1GenericExample】 下面先看一段程序,定义两个类User(用户)和Admin(管理员),然后通过集合遍历类的对象,如图6.13所示。,6.7.2 泛型,泛型,即通过参数化类型来实现在同一份代码上操作

28、多种数据类型。泛型是在C#2.0引入的。泛型(Genericity)的字面意思是指具有在多种数据类型上皆可操作的含意,与模板有些相似。泛型引入了类型参数化的概念,旨在实现定义的泛型类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险。为了使用这些强有力的数据结构,你所要做的仅是提供数据类型。C#泛型的几个特点: (1)如果实例化泛型类型的参数相同,那么JIT编译器会重复使用该类型。 (2)C#的泛型类型可以应用于强大的反射技术。 (3)C#的性能高,我们知道ArrayList添加元素

29、时都是object类型,如果添加一个值类型,就需要把它转换为引用类型,当取出这个元素的时候又要将其转换为值类型,这就需要装箱和拆箱的操作,性能降低。而泛型无需类型的转换操作。 (4)C#除可单独声明泛型类型(包括类与结构)外,也可在基类中包含泛型类型的声明。但基类如果是泛型类,它的类型参数要么已实例化,要么来源子类(同样是泛型类型)声明的类型参数。,6.7.3 使用泛型集合List,【本节示例参考:源代码chapter66.7.3ListExample】 List泛型集合具有很大的类型安全性。在System.Collections.Generic命名空间中定义了许多泛型集合类,这些集合可以用来

30、替代我们之前学习的集合操作类。List的用法非常类似于ArrayList,它的定义语法如下: List users = new List(); 其中List中的“T”被相应的数据类型所替代,如List表示泛型集合存储的元素是User对象。在实例化泛型时,后面别忘记了加“()”。定义一个List泛型集合以后,可以像ArrayList一样对元素添加、删除和遍历。,6.7.4 使用泛型集合Dictionary,【本节示例参考:源代码chapter66.7.4DictionaryExample】 泛型集合Dictionary存储数据的方式和哈希表类似,通过键/值(Key/Value)对保存数据。它具有

31、泛型的全部特征,编译的时候就检查类型约束,获取元素的时候无须类型转换。定义的语法如下: Dictionary users = new Dictionary(); 泛型提供了很好的类型安全策略,如果学习了HashTable的使用方法,对于Dictionary的使用就会变得很容易。,6.8 小结,学完本章后,读者将了解以下内容。 (1)了解面向对象中类、对象、类成员的概念。 (2)能够定义类,实例化对象,添加类成员。 (3)理解Object类,并使用Object类的方法。 (4)了解C#框架类库,使用框架类库,学会引用.NET的命名空间。 (5)使用集合类,了解几个集合类之间的区别。 (6)使用泛

32、型类,了解使用泛型类的好处。,本章习题,一、选择题 1在类的定义中,类的( )描述了该类的对象的行为特征 A类名 B方法 C所属的名字空间 D字段 2以下是类MyClass的定义,count属性属于( ) class MyClass int i; int count get return i; A只读 B只写 C可读写 D不可读不可写 二、简答题 1简述C#中属性和字段的区别。 2编写一个控制台程序,添加一个汽车类Car ,它包含以下三种属性: 颜色(Color),读写属性 车名(Name),读写属性 产地(ProductPlace),只读属性 并包含一个方法Run(),该方法输出车的以上属性信息。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1