深入浅出面向对象程序设计演示教学.ppt

上传人:豆**** 文档编号:66110874 上传时间:2022-12-14 格式:PPT 页数:52 大小:369.50KB
返回 下载 相关 举报
深入浅出面向对象程序设计演示教学.ppt_第1页
第1页 / 共52页
深入浅出面向对象程序设计演示教学.ppt_第2页
第2页 / 共52页
点击查看更多>>
资源描述

《深入浅出面向对象程序设计演示教学.ppt》由会员分享,可在线阅读,更多相关《深入浅出面向对象程序设计演示教学.ppt(52页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、深入浅出面向对象程序设计面向对象和面向过程面向过程面向过程:首先分析出解决问题所需要的步骤首先分析出解决问题所需要的步骤;然后用函数把这些步骤一步一步实现然后用函数把这些步骤一步一步实现;使用的时候一个一个依次调用就可以了。使用的时候一个一个依次调用就可以了。面向对象面向对象:把构成问题事务分解成各个对象,建立对象的目把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。物在整个解决问题的步骤中的行为。五子棋游戏设计思考(1)分析问题(2)设计算法(3)编写程序(4)编译运行(5)分析结果面

2、向过程设计回到步骤二进行下一局设计思路一设计思路一面向对象设计设计思路二设计思路二面向对象程序设计的基本概念OOP的三大特性:u封装u继承u多态2类(class)和对象(object)对象指的是一个实体的实例,在这个实体中包括了特定对象指的是一个实体的实例,在这个实体中包括了特定的属性数据和对这些数据进行操作的函数。的属性数据和对这些数据进行操作的函数。对象可以是:对象可以是:现实生活中的一个物理对象(一辆汽车,一个人,一本书)现实生活中的一个物理对象(一辆汽车,一个人,一本书)某一概念实体的实例(一个图形,一种管理方式)某一概念实体的实例(一个图形,一种管理方式)类是一组具有相同数据结构和相

3、同操作的对象的集合。类是一组具有相同数据结构和相同操作的对象的集合。在一个类中,每个对象都是类的实例,可以使用类中提在一个类中,每个对象都是类的实例,可以使用类中提供的方法。供的方法。创建类的对象的操作,被称为类的实例化。创建类的对象的操作,被称为类的实例化。2.1类的声明 类声明语句声明一个新类,其语法格式为:类声明语句声明一个新类,其语法格式为:特征特征修饰符修饰符classclass类名类名:基类名和任何实现接口的列基类名和任何实现接口的列表表 类体类体 uu 对象引用:对象引用:Customerc;Customerc;c=newCustomer();/c=newCustomer();/

4、这中间发生了什么事情?这中间发生了什么事情?类的成员一个类就是一个数据结构,可以包含:l数据成员(常量、字段和事件);l函数成员(方法、属性、下标指示器、操作符、构造函数和析构函数);l嵌套的类型2.2类成员的访问修饰符 C#C#支持的类修饰符有:支持的类修饰符有:newnew、publicpublic、protectedprotected、internalinternal、privateprivate、abstractabstract和和sealedsealed。new-new-嵌套类声明时使用,表明隐藏父类中同名的成员。嵌套类声明时使用,表明隐藏父类中同名的成员。Public-Public

5、-没有限制(类内部,类对象都可访问)没有限制(类内部,类对象都可访问)Private-Private-只有类内部可以访问只有类内部可以访问 Protected-Protected-只有本类内部和子类内部可以访问只有本类内部和子类内部可以访问(本类和子类的对象本类和子类的对象不能访问不能访问)Internal-Internal-同一个命名空间下的对象可以访问;同一个命名空间下的对象可以访问;注意:注意:命名空间下的类只有两个显式的修饰符:命名空间下的类只有两个显式的修饰符:publicpublic,internalinternal;默认类的访问修饰符是:默认类的访问修饰符是:internalin

6、ternal2.3构造函数和析构函数构造函数:构造函数:构造函数用于初始化构造函数用于初始化 构造函数构造函数 与与 类类 同名,且没有返回值同名,且没有返回值 构造函数通常是构造函数通常是publicpublic的的 可以有多个重载的构造函数可以有多个重载的构造函数 如果不写构造函数,系统会提供一个缺省的无参数构造函如果不写构造函数,系统会提供一个缺省的无参数构造函数(如果写了,系统将不再提供)数(如果写了,系统将不再提供)构造函数在创建对象的时候调用(构造函数在创建对象的时候调用(newnew一个类的实例时)一个类的实例时)析构函数:析构函数:析构函数用于释放被占用的系统资源析构函数用于释

7、放被占用的系统资源 形式上与构造函数相同,除了在名称前面加形式上与构造函数相同,除了在名称前面加:析构函数不能显示的去调用析构函数不能显示的去调用 当对象超出了有效范围,系统自动调用其析构函数;当对象超出了有效范围,系统自动调用其析构函数;关键字this thisthis只当前对象;只当前对象;例如:例如:classstudentclassstudent stringname=ss;stringname=ss;publicstudent(stringname)publicstudent(stringname)this.name=name;this.name=name;publicvoidtes

8、t(stringname)publicvoidtest(stringname)Console.WriteLine(name);Console.WriteLine(name);Console.WriteLine(this.name);Console.WriteLine(this.name);2.4属性(property)属性是对现实世界中实体特征的抽象,它提供了对类或对属性是对现实世界中实体特征的抽象,它提供了对类或对象性质的访问;象性质的访问;比如,一个用户的姓名、一个文件的大小、一个窗口的标比如,一个用户的姓名、一个文件的大小、一个窗口的标题,都可以作为属性。题,都可以作为属性。C#C#中的

9、属性更充分地体现了中的属性更充分地体现了对象的封装性对象的封装性:不直接操作类:不直接操作类的数据内容,而是通过访问器进行访问。它借助于的数据内容,而是通过访问器进行访问。它借助于getget和和setset对属性的值进行读写;对属性的值进行读写;内部像函数,外部看像字段内部像函数,外部看像字段 在属性的访问声明中:在属性的访问声明中:只有只有setset访问器,表明属性的值只能进行设置而不能读出。访问器,表明属性的值只能进行设置而不能读出。只有只有getget访问器,表明属性的值是只读的,不能改写。访问器,表明属性的值是只读的,不能改写。同时具有同时具有setset访问器和访问器和getge

10、t访问器,表明属性的值的读写都访问器,表明属性的值的读写都是允许的。是允许的。2.5static修饰符 静态成员和非静态成员静态成员和非静态成员:静态成员静态成员 属于属于 该类的所有对象实例;(无论这个类创建该类的所有对象实例;(无论这个类创建了多少个副本,一个静态成员在内存中只占有一块区域)了多少个副本,一个静态成员在内存中只占有一块区域)类的非静态成员属于类的实例所有,每创建一个类的实例,类的非静态成员属于类的实例所有,每创建一个类的实例,都在内存中为非静态成员开辟了一块区域。都在内存中为非静态成员开辟了一块区域。静态成员在类外部使用静态成员在类外部使用类名访问类名访问 非静态方法在类外

11、部非静态方法在类外部使用实例名访问使用实例名访问 静态方法和非静态方法静态方法和非静态方法:静态方法中:只能直接访问其他静态成员和其他静态方法;静态方法中:只能直接访问其他静态成员和其他静态方法;静态方法在类外部使用类名访问静态方法在类外部使用类名访问 非静态方法在类外部使用实例名访问非静态方法在类外部使用实例名访问2.6重载方法重载方法名相同,方法参数列表不同;操作符重载必须声明为static和public运算符操作的是对象一元运算符重载二元运算符重载,其中有两个参数,分别为左操作数和右操作数练习1 1、设计一个类表示银行账户,数据成员有姓名、设计一个类表示银行账户,数据成员有姓名、账号、余

12、额;可以进行的操作有:取款、存款、账号、余额;可以进行的操作有:取款、存款、打印账户信息;打印账户信息;2 2、设计一个类来表示矩阵,并重载矩阵的加法;、设计一个类来表示矩阵,并重载矩阵的加法;3 3、设计一个类(、设计一个类(playerplayer),表示游戏中的角色),表示游戏中的角色(该角色有耐力和体力),重载游戏角色的(该角色有耐力和体力),重载游戏角色的+运运算符,该运算符表示升级;算符,该运算符表示升级;如:如:playerp=newplayer();playerp=newplayer();p+;p+;/表示该角色升级,耐力和体力分别加表示该角色升级,耐力和体力分别加100100

13、;2121本章目标类的继承多态性抽象类密封类接口接口和抽象类类和结构的区别委托和事件3类的继承现实世界中的许多实体之间不是相互孤立的,它们往往具有共同的特征,也存在内在的差别。人们可以采用层次结构来描述这些实体之间的相似之处和不同之处。3.1继承规则 C#C#中,派生类只能从一个类中继承(中,派生类只能从一个类中继承(单继承单继承););继承是可传递的继承是可传递的。如果。如果C C从从B B中派生,中派生,B B又从又从A A中派生,中派生,那么那么C C不仅继承了不仅继承了B B中声明的成员,同样也继承了中声明的成员,同样也继承了A A中的中的成员。成员。ObjectObject类作为所有

14、类的基类。类作为所有类的基类。派生类应当是对基类的扩展。派生类可以添加新的成员,派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去己经继承的成员的定义。但不能除去己经继承的成员的定义。构造函数和析构函数不能被继承构造函数和析构函数不能被继承。除此以外的其它成员,。除此以外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。中成员的访问方式只能决定派生类能否访问它们。类的继承中构造函数如何执行 当创建派生类的对象时:系统是先创建基类,然后再创当创建派生类的对象时:系统是先创建基类,然后再

15、创建子类;建子类;即即,系统将会先调用基类的构造函数再调用派生类的构造系统将会先调用基类的构造函数再调用派生类的构造函数函数;注意:注意:实例化子类时,默认是调用父类的无参数构造函数实例化子类时,默认是调用父类的无参数构造函数 如果想调用父类有参构造函数,需要在子类的构造函数如果想调用父类有参构造函数,需要在子类的构造函数后面显示的去调用,如:后面显示的去调用,如:publicTriangle(doublex,doubley)publicTriangle(doublex,doubley):base(x,y):base(x,y)3.2类的覆盖 子类的成员声明中,可以声明与继承而来的成员同名的成子

16、类的成员声明中,可以声明与继承而来的成员同名的成员;这时我们称派生类的成员覆盖员;这时我们称派生类的成员覆盖(hide)(hide)了基类的成员。了基类的成员。这种情况下,编译器不会报告错误,但会给出一个警告。这种情况下,编译器不会报告错误,但会给出一个警告。对派生类的成员对派生类的成员 使用使用newnew关键字关键字,可以关闭这个警告。,可以关闭这个警告。3.3Base关键字 basebase关键字主要是为派生类调用基类成员提供一个简写的关键字主要是为派生类调用基类成员提供一个简写的方法;方法;使用使用basebase关键字对基类成员的访问格式为:关键字对基类成员的访问格式为:base.b

17、ase.标识符标识符1多态性“多态性”一词最早用于生物学,指同一种族的生物体具有相同的特性。在C#中,多态性的定义是:同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。C#支持两种类型的多态性:(1)编译时的多态性(2)运行时的多态性编译时的多态性(重载Overload)编译时的多态性是通过重载来实现的。系统在编译时,根据传递的参数、返回的类型等信急决定实现何种操作。如:如:类中定义的方法的不同版本类中定义的方法的不同版本publicintCalculate(intx,inty)publicintCalculate(intx,inty)publicdoubleCa

18、lculate(doublex,doubley)publicdoubleCalculate(doublex,doubley)特点:特点:方法名必须相同方法名必须相同参数列表必须不相同参数列表必须不相同运行时的多态性(重写Override)运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。多态性:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。多态性通过派生类覆写基类中的虚函数型方法来实现。涉及到的关键字:virtual,override虚方法(Virtual)当类中的方法声明前加上了virtual修饰符,我们称之为虚方法,

19、反之为非虚。对于非虚的方法,无论被其所在类的实例调用,还是被这个类的派生类的实例调用,方法的执行方式不变。而对于虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。在派生类中对虚方法进行重载 普通的方法重载普通的方法重载指的是:指的是:类中两个以上的方法(包括隐藏的继承而来的方法),类中两个以上的方法(包括隐藏的继承而来的方法),取的取的名字相同名字相同,只要使用的,只要使用的参数类型或者参数个数不同参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法。编译器便知道在何种情况下应该调用哪个方法。对基类虚方法的重载对基类虚方法的重载是函数重载的另一种特殊形式;要

20、是函数重载的另一种特殊形式;要求的是方法名称、返回值类型、参数表中的参数个数、求的是方法名称、返回值类型、参数表中的参数个数、类型、顺序都必须与基类中的虚函数类型、顺序都必须与基类中的虚函数完全一致完全一致。在派生。在派生类中声明对虚方法的重载,类中声明对虚方法的重载,多态性的好处在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。2抽象类抽象类:有时候,基类并不与具体的事物相联系,而是只表达一种抽象的概念,用以为它的派生类提供一个公共的界面。为此,C#中引入了抽象类(

21、abstractclass)的概念。抽象类使用abstract修饰符抽象类的使用规定(1)抽象类只能作为其它类的基类,它不能直接被实例化(2)抽象类允许包含抽象成员,虽然这不是必须的。(3)抽象类不能同时又是密封的。(4)如果一个非抽象类从抽象类中派生,则其必须通过重载来实现所有继承而来的抽象成员抽象方法一个方法声明中如果加上abstract修饰符,我们称该方法为抽象方法(abstractmethod)。抽象方法只是定义一个结构,没有方法主题部分,用“;”来结束。注意:含有抽象方法的类一定是抽象类抽象类不一定含有抽象方法抽象类提供继承和接口实现的功能。何时使用抽象类呢?当需要一组相关组件来包含

22、一组具有相同功能的方法,但同时要求在其他方法实现中具有灵活性时,可以使用抽象类。3密封类 想想看,如果所有的类都可以被继承,继承的滥用会带来想想看,如果所有的类都可以被继承,继承的滥用会带来什么后果什么后果?类的层次结构体系将变得十分庞大,类之间的关系杂乱无类的层次结构体系将变得十分庞大,类之间的关系杂乱无章,对类的理解和使用都会变得十分困难。章,对类的理解和使用都会变得十分困难。有时候,我们并不希望自己编写的类被继承。另一些时候,有时候,我们并不希望自己编写的类被继承。另一些时候,有的类己经没有再被继承的必要。有的类己经没有再被继承的必要。C#C#提出了一个密封类(提出了一个密封类(seal

23、edclasssealedclass)的概念)的概念.注意注意:密封类不能同时又是抽象类,因为抽象总是希望被:密封类不能同时又是抽象类,因为抽象总是希望被继承的。继承的。密封方法密封方法(sealedmethod)的概念,以防止在方法所在类的派生类中对该方法的重载。4接口 从技术上讲,接口是一组包含了函数型方法的数据结构。从技术上讲,接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组建对象的功能。通过这组数据结构,客户代码可以调用组建对象的功能。接口(接口(interfaceinterface)用来定义一种)用来定义一种程序的协定程序的协定。接口可以从多个基接口继承(接

24、口可以多继承),而类接口可以从多个基接口继承(接口可以多继承),而类或结构可以实现多个接口。或结构可以实现多个接口。实现接口的类或者结构要与接口的定义实现接口的类或者结构要与接口的定义严格一致严格一致。接口本身接口本身不提供不提供它所定义的成员的它所定义的成员的实现实现。接口只指定实现该接口的类或接口必须提供的成员。接口只指定实现该接口的类或接口必须提供的成员。接口好比是一个模板,接口不能被实例化接口好比是一个模板,接口不能被实例化接口的定义定义接口的一般形式为 接口修饰符接口修饰符interfaceinterface接口名接口名:基类接口名基类接口名/接口的成员接口的成员;接口的访问权限:p

25、rivate,public,protected,internal接口可以包含方法、属性、事件和索引器。按照惯例,接口的名字以大写字母“I”开头注意:接口不能包含字段(域和属性);在C#中,接口内的所有方法默认都是公用方法。显式为接口的方法指定public修饰符是非法的;命名空间下的接口修饰符只能为:public,internal;添加其它修饰符将编译出错默认的接口修饰符为internal(注意能够比较internal和public的区别)internal:同一个程序集内可以访问修饰符补充注意能够比较internal和public的区别internal:同一个程序集内可以访问所有修饰符:Priv

26、ate,protected,internal,protectedinternal,publicprotectedinternal:同一个程序集中的所有类(类内部或者类对象),以及所有程序集中的子类都可以访问(限类内部)。抽象类和接口-抽象类抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。抽象类和接口-相似点1、不能实例化;2、包含未实现的方法声明;3、派生类必须实现未实现

27、的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);抽象类和接口-不同点1、类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类;而接口只是一个行为的规范或规定,表述一类类“我能做。”;2、接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;3、一个类一次可以实现若干个接口,但是只能扩展一个父类;4、抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的.5、(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。6、好的接

28、口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。7、如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法.8、抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。看下面的比喻:1.1.飞机飞机F22F22会飞,鸟会飞,他们都继承了同一个接口会飞,鸟会飞,他们都继承了同一个接口“飞飞”;但是;但是F22F22属于飞机抽象类,鸽子属于鸟抽象类。属于飞机抽象类,鸽子属于鸟抽象类。2.2.就像铁门木门都是门(抽象类),你想要个门我

29、给不就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。一个门可以有锁(接口)也可以有门铃(多实现)。门门(抽象类)定义了你是什么,接口(锁)规定了你能做(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染)。发出声音吧(接口污染)。分享有关分享有关学习学习OOP的方法的方法深入浅出码海战略编程三境学历代表过去;能力代表现在;学习力代表未来。成为一个软件“研发者”而不仅仅是一个CODER。相信是万能的开始相信是万能的开始谢谢此课件下载可自行编辑修改,仅供参考!此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢感谢您的支持,我们努力做得更好!谢谢

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com