c#面向对象程序设计.ppt
《c#面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《c#面向对象程序设计.ppt(175页珍藏版)》请在三一办公上搜索。
1、第4章 面向对象的编程基础,什么是面向对象编程面向对象编程是当前最流行,同时也是技术最成熟,规范最完善的编程理念和技术,相对于传统的面向过程编程方法,面向对象编程具有强大的优势,解决了代码的重用问题,极大提高了开发人员的工作效率。如果一种语言支持面向对象风格的编程,便称其为面向对象编程语言,C#就是支持面向对象编程的语言之一。为什么要使用面向对象编程面向过程的编程方法:模块之间依赖性强,代码重用率低,维护性差。面向对象的编程方法:每个模块用于实现特定的功能,且这些模块之间都是相互独立的。传统的应用程序在执行方式上通常是简单的、线性的,面向对象编程以结构、数据的含义以及数据与数据之间的交互操作为
2、基础,这意味着开发人员需要将更多的精力放在程序的设计阶段,但程序的可扩展性很强。,第4章 面向对象的编程基础,面向对象程序设计的基本概念(1)类和对象 通常把具有同样性质和功能的东西所构成的集合叫作类。(2)属性、方法与事件 属性是对象的状态和特点。方法是对象能够执行的一些操作,它体现了对象的功能。事件是对象能够识别和响应的某些操作。(3)封装 所谓的封装,就是将用来描述客观事物的一组数据和 操作组装在一起,形成一个类。,第4章 面向对象的编程基础,(4)继承 类之间除了有相互交流或访问的关系以外,还可能存在着一种特殊的关系,这就是继承。在Visual C#中只支持单继承,即一个派生类只能有一
3、个基类。(5)重载 重载指的是方法名称一样,但如果参数不同,就会有不同的具体实现。重载主要有两类:方法重载及运算符重载。(6)多态性 所谓多态性就是在程序运行时,面向对象的语言会自动判断对象的派生类型,并调用相应的方法。,4.1 类,4.1.1 类的声明及使用 任何类型都需要先声明,然后才使用。我们能够直接使用int、double和string等基础类型,是因为.NET基础类库中已经声明了他们。一个类一旦被成功声明,就可以当成一种新的类型来使用(引用类型)。,C#中的类声明 格式:类的修饰符 class 类名:基类或接口 类体;类的访问修饰符是可选的,C#中定义了以下几种访问修饰符:inter
4、nal:内部类,表明仅有本程序能够访问该类。public:公有类,表示外界可以不受限制的访问该类。private 私有类,定义在一个类中,在定义它的类中可以访 问它。protected:保护类,表示可以访问该类或从该类派生的类型。(类和它的派生类可以访问该类)abstract:抽象类,只能做其它类的基类。sealed:密封类,该类不能做其他类的基类。类的默认修饰符为internal.class和类名是必需的;基类或接口是可选的,但如果存在,则基类或接口就是必需的;类体是必需的,可以为空。,C#的类名是一种标识符,必须符合标识符的命名规则。类名最好能够体现类的含义和用途。【例4-1】定义一个St
5、udent类,用来对学生的信息和功能进行描述。假设学生具有学号、姓名、年龄、性别、平均成绩等特征。,【例5-1】using System;/引入名称空间public class Student/定义学生类 private string No;/学号 private string Name;/姓名 private int Age;/年龄 private char Sex;/性别 private double Aver;/平均成绩,4.2 类的成员,定义在类体内的元素都是类的成员。类的主要成员包括两种类型,即描述状态的数据成员和描述操作的函数成员。类的数据成员包括:字段(域)常量,例如:下面的Pe
6、rson类定义了两个数据成员Class Person string name;const int age=1;/默认为static属性 此例中,name即为字段成员,age就是常量成员。,类的函数成员包括:方法属性索引器事件运算符构造方法和析构方法,方法(函数)用来实现类执行的计算和操作,使用前必须先定义。方法(函数)具有一个参数列表(可以为空);同时还具有一个返回类型,指定该方法计算和返回的值的类型。如果方法不返回值,则返回值类型为void。此时return可以不写。*一个return只能返回一个值。,例如:Class Person string name;int age=10;void S
7、peak()Console.WriteLine(“Hello World!”);,属性与访问器 属性 属性可以让用户可以象访问公有成员字段一样访问私有成员字段。属性由一个字段声明和存取器组成,存取器指定在它们的值被读取或写入时需执行的语句。,属性声明的格式:【修饰符】【类型】属性名 get【get访问体】set【set访问体】,get 访问器 可以对成员的值进行读操作,get 访问器对应一个不带参数的方法它返回一个和属性相同类型的值。,set 访问器 set访问器可以对成员的值进行操作。通过value隐式参数间接的对私有字段赋值。并且可以包含大量的语句,对赋予的值进行检查,如果值不安全或者不符
8、合要求,就可以进行提示。这样可以避免因为给类的数据成员设置了错误的值而导致的错误。,请看下面的代码:using System;class Rectangle protected int width;protected int height;public int Width get return width;set if(value 0)width=value;else Console.WriteLine(Width的值不能为负数);,public int Height get return height;set if(value 0)height=value;else Console.Writ
9、eLine(Height的值不能为负数);public int Area get return width*height;,public Rectangle()static void Main(string args)Rectangle rect=new Rectangle();rect.Height=2;rect.Width=4;Console.WriteLine(长方形:宽=0,长=1,面积=2,rect.Width,rect.Height,rect.Area);Rectangle rect1=new Rectangle();rect1.Height=-2;rect.Width=-4;Co
10、nsole.WriteLine(长方形:宽=0,长=1,面积=2,rect1.Width,rect1.Height,rect1.Area);,C#中的属性分别通过get和set访问器来对属性的值进行读写。get和set访问器是可选的。get访问器体与方法体相似。它必须返回属性类型的值。执行get访问器相当于读取字段的值。get访问器可以用return语句返回一个属性值。set访问器与返回void的方法类似。它使用称为value的隐式参数,此参数的类型是属性的类型。根据get和set访问器是否存在,属性可分为以下类型:读写属性 只读属性 只写属性,属性与字段的区别:属性可以实现只读或只写,而字段
11、不能属性的set方法可以对用户指定的值(value),进行有效检查,而保证只有正确的状态才能得到设置,而字段不能属性的get方法不仅可以返回字段变量的值,还可以返回经过计算或处理过的数据,如上例中的Area属性属性在实现时,实际上是方法的实现。,在C#中,属性更好地表达了事物的状态的设置与获取。在C#中一般采用以下原则:若在类的内部记录事物的状态信息,则使用字段变量字段变量一般使用private/protected修饰对外公布信息时,则使用属性属性一般与某个或某几个字段变量有对应关系,属性与方法的主要区别:1、属性不必使用括号,但方法一定要使用括号。2、属性不能指定参数,方法可以指定参数。3、
12、属性不能使用void类型,方法可以使用void类型。,构造函数与析构函数,构造方法是名称与类名相同的特殊方法,当类被实例化时,首先执行构造方法;析构方法也是一种特殊的方法,其名称由“”和类名构成,当类的实例被撤销时,执行的方法。,1构造函数 构造函数主要用来为对象分配存储空间,完成初始化操作(如给类的成员变量赋值等)。class 类名 类名(参数表)语句;,在C#中,类的构造函数遵循以下规定。(1)构造函数的函数名和类的名称一样。(2)当某个类没有构造函数时,系统将自动为其创建构 造函数,这种构造函数称为默认构造函数。如果一个类含有构造函数则系统不创建(3)构造函数的访问修饰符总是public
13、。如果是private 则表示这个类不能被实例化,这通常用于只含有静 态成员的类中。(4)构造函数由于不需要显式调用,因而不用声明返回 类型。(5)构造函数可以带参数也可以不带参数。,下面代码说明了构造方法的声明方式:using System;using System.Collections.Generic;using System.Text;namespace 面向对象3 class Dog public string name;public Dog()name=未知;Console.WriteLine(Dog类已经被实例化);public void Bark()Console.WriteL
14、ine(汪汪);static void Main(string args)Dog myDog=new Dog();Console.Write(myDog的名字为0,myDog.name);Console.WriteLine(叫声为);myDog.Bark();Console.ReadKey();,带参数的构造函数 上面例子中的构造函数不带参数,构造函数也可以带有参数.一个类可以有多个具有不同参数的构造函数,根据参数类型和个数的不同来完成不同的功能,这种方式称为构造函数的重载。请看下面代码:,请看下面代码:class Dog public string name;public int age;p
15、ublic Dog()name=未知;age=1;Console.WriteLine(Dog():Dog类已经被实例化);public Dog(string dogName)name=dogName;age=1;Console.WriteLine(Dog(string):Dog类已经被实例化);,析构函数 析构函数在对象销毁时被调用,常用来释放对象占用的存储空间。class 类名 类名()语句;析构函数具有以下特点。(1)析构函数不能带有参数。(2)析构函数不能拥有访问修饰符。(3)不能显式地调用析构函数。(4)析构函数的命名规则是在类名前加上一个 号。(5)析构函数在对象销毁时自动调用。,u
16、sing system;class Exam static public int a;public int b;public Exam()a=0;b=0;public Exam(int m,int n)a=m;b=n;Exam(),using system;Class First()public First()console.writeLine(“Firsts constructor is called”);First()console.writeLine(“Firsts destructor is called”);Class Second()public Second()console.w
17、riteLine(“Seconds constructor is called”);Second()console.writeLine(“Seconds destructor is called”);,Class Third()public Third()console.writeLine(“Thirds constructor is called”);Third()console.writeLine(“Thirds destructor is called”);,Public class MainClass public static void main()First myobject1=n
18、ew First();Second myobject2=new Second();Third myobject3=new Third();,索引器可以让我们把对象当成数组一样访问。事件用于定义可由类生成的通知或者消息,事件会导致相关代码的执行。运算符通过重载,可以扩大运算符的功能。,访问修饰符类成员访问修饰符的意义,访问修饰符都可用于类的成员,当没有定义访问修饰符时,类的成员的默认修饰符为private。下面程序说明了类成员访问修饰符的使用方法,class Vehicle public string model;protected string engine;private string de
19、signer;internal string factory;public void Dive()Console.WriteLine(我喜欢它);,class Manufactor static void Main(string args)Vehicle car=new Vehicle();car.model=ABC123;/能够访问public修饰的成员变量 car.engine=xyz-qe;/不能够访问protected修饰的成员变量 car.designer=Michel Jordon;/*不能够访问 private 修饰的成员变量*/car.factory=FAW;/能够访问inte
20、rnal修饰的成员变量 car.Dive();/能够访问public修饰的成员方法,什么是对象 对象是OOP应用程序的一个组成部件,该部件可以是一个过程、一些数据或者一些更为抽象的实体。C#中的对象是从类型中创建的,就像声明变量一样,对象的类型在C#中被称为“类”。声明类的一个对象称为是该类的实例化,“类的实例”和对象表示相同的含义,但“类”和“对象”却是完全不同的 概念。,面向对象编程,类,对象,对象的生命周期 在每个对象中,或者说在类的每个实例中,至少有一个属性具有状态。对象的状态是指在某一时刻对象中数据成员的值,实际上,每个对象都有一个明确定义的生命周期,除了使用时的正常状态外,还包含两
21、个重要的阶段:构造阶段:对象的初始化过程,由构造函数来完成。析构阶段:对象在被删除时的一些清理工作,如释放内存等,由析构函数来完成。,面向对象编程,对象的声明 类是抽象的,要使用类定义的功能,必须将类实例化,即创建类的对象。创建对象的格式:类名 对象名=new 类名(参数列表);,例如声明Person类的一个对象Mary:Person Mary=new Person();注:创建类的实例、实例化类、声明对象等说法是等价的,都说明以类为模板生成了一个对象的操作,使用new关键字创建一个类的对象同时,也为该对象分配了内存空间,每一个对象都有不同的内存。因此,两个不同的对象,即使它们的所有成员的值和
22、代码都相同,它们也是不相等的。就像同一型号的每一辆车都不一样。,class Dog public string name;public void Bark()Console.WriteLine(汪汪);,class DifferentDog static void Main(string args)Dog myDog=new Dog();myDog.name=豆豆;Dog yourDog=new Dog();yourDog.name=豆豆;/*如果将该句改名yourDog=myDog,那么结果如何?*/Console.WriteLine(我的狗的名字为0,叫声为,myDog.name);myD
23、og.Bark();Console.WriteLine(你的狗的名字为0,叫声为,yourDog.name);yourDog.Bark();if(myDog=yourDog)Console.WriteLine(我的狗和你的狗是同一条狗!);else Console.WriteLine(我的狗和你的狗名字相同,但不是同一条狗!);Console.ReadKey();,静态成员与实例成员 在类的成员的类型前面加上关键字static,就能将该成员定义为静态成员。其他没有用static修饰的成员都是实例成员或称为非静态成员。静态成员属于类,实例成员属于对象(类的实例)。静态成员具有以下特征:静态成员必
24、须通过类名使用.运算符引用,不能用对象名引用 一个静态字段只标识一个存储位置。无论创建多少个该类的实例,它的静态字段在内存中都只占同一块区域 静态函数成员不能作用于具体的实例,必须通过类名来引用,常量也属于静态成员,实例成员具有以下的特点:实例成员必须通过对象名使用.运算符来引用,而不能用类名来引用。类的实例字段属于类的实例所有,每创建一个类的实例,都在内存中为实例字段开辟了一块区域。类的每个实例分别包含一组该类的所有实例字段的副本。实例函数成员作用于类的给定实例。分析下面程序运行结果,using System class Count public static int count=0;pub
25、lic int number=0;public void CountPlus()number=0;count=count+1;number=number+1;class test static void Main(string args)Count a=new Count();a.CountPlus();Console.WriteLine(0,1,a.number,Count.count);a.CountPlus();Console.WriteLine(0,1,a.number,Count.count);Count b=new Count();b.CountPlus();Console.Wri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c# 面向 对象 程序设计
链接地址:https://www.31ppt.com/p-6502431.html