还剩5页未读,继续阅读
文本内容:
达内学习心得精心总结的面向对象
一、封装这是一种隐藏信息的特性拿本节引例来说,类将数据结构与算法隐藏在类的内部,外界使用者无需知道具体技术实现细节即可使用此类封装这一特calculatedate性不仅大大提高了代码的易用性,而且还使得类的开发者可以方便地更换新的算法,这种变化不会影响使用类的外部代码可以用以下公式展示类的封装特性封装的类数据对此数据所进行的操作(即算法)通俗地说,封装就是包起外界不必需要知道的东西,只向外界展露可供展示的东西在面向对象理论中,封装这个概念拥=+有更为宽广的含义小到一个简单的数据结构,大到一个完整的软件子系统,静态的如某软件系统要收集数据信息项,动态的如某个工作处理流程,都可以封装到一个类中具备这种封装的意识,是掌握面向对象分析与设计技巧的关键
二、继承“”继承是面向对象编程中一个非常重要的特性,它也是另一个重要特性多态的基础现实生活中的事物都归属于一定的类别在一些书中,将父类称为超类——()继承关系有时又称为派生关系,继承自,可以说为派生自,或反过来说,派生出父类与子类之间拥有以下两个基本特性superclass“”“”“b a”“b()是一种()关系子类是父类的一种特例a”“a b”()扩充()关系子类拥有父类所没有的功能1is-a类成员的访问权限2extends面向对象编程的一大特点就是可以控制类成员的可访问性当前主流的面向对象语
1.言都拥有以下三种基本的可访问性()公有访问不受限制()私有只有类自身成员可以访问1public()保护子类可以访问,其他类无法访问2private由此可见,可以通过子类对象访问其父类的所有公有成员,事实上,外界根本分不清3protected楚对象的哪些公有成员来自父类,哪些公有成员来自子类自身小结一下继承条件下的类成员访问权限()所有不必让外人知道的东西都是私有的()所有需要向外提供的服务都是公有的1()所有的祖传绝招,秘不外传的都是保护的23“”“”中还有一种可访问性,就是由关键字所确定的内部访问性有点像,外界类也可以直接访问声明为的类或类的成员,但这只局限c#internal“”internal于同一个程序集内部public internal读者可以简单地将程序集理解为一个独立的或文件一个或文件中可以有多个类,如果某个类可被同一程序集中的类访问,但其他程序集中的类不能dll exedll exe访问它,则称此类具有访问性是的默认可访问性,这就是说,如果某个类没有任何可访问性关键字在它前面,则它就是的internal internalc#子类父类变量的相互赋值internal子类对象可以被当成基类对象使用这是因为子类对象本就是一种()父类对象,
2.因此,以下代码是合法的is_aparentp;sonc=newson;然而,反过来就不可以,父类对象变量不可以直接赋值给子类变量如果确信父类变p=c;量中所引用的对象的确是子类类型,则可以通过类型强制转换进行赋值,其语法格式为子类对象变量(子类名称)基类对象变量子类对象变量基类对象变量子类名称=;方法重载、隐藏与虚方法调用=as;由于子类对象同时汇集了父类和子类的所有公共方法,而并未对子类和父类的方
3.法名称进行过多限制,因此,一个问题出现了如果子类中某个方法与父类方法的签c#名一样(即方法名和方法参数都一样),那当通过子类对象访问此方法时,访问的是子类还是父类所定义的方法让我们先从子类方法与父类方法之间的关系说起总的来说,子类方法与父类方法之间的关系可以概括为以下三种()扩充()子类方法,父类没有;()重载()子类有父类的同名函数,但参数类型或数目不一样;1extend()完全相同子类方法与父类方法从方法名称到参数类型完全一样2overload当子类与父类拥有完全一样的方法时,称子类隐藏了父类的同名方法,当分别位于3父类和子类的两个方法完全一样时,调用哪个方法由对象变量的类型决定关“键字明确告诉编译器,子类隐藏父类的同名方法,提供自己的新版本如果子类“new”隐藏了父类的同名方法,要在子类方法的实现代码中调用父类被隐藏的同名方法时c#要使用关键字如果子类隐藏了父类的同名方法,不进行强制转换,就无法通过父类变量直接调用子类的同名方法,哪怕父类变量引用的是子类对象这是不太base合理的我们希望每个对象都只干自己职责之内的事,即如果父类变量引用的是子类对象,则调用的就是子类定义的方法,而如果父类变量引用的就是父类对象,则调用的是父类定义的方法这就是说,希望每个对象都各人自扫门前雪,莫管他人瓦上霜为达到这个目的,可以在父类同名方法前加关键字,表明这是一个虚“方法,子类可以重写此方法即在子类同名方法前加关键字,表明对父类同”virtual名方法进行了重写所以,将父类方法定义为虚方法,子类重写同名方法之后,通过override父类变量调用此方法,到底是调用父类还是子类的,由父类变量引用的真实对象类型决定,而与父类变量无关很明显,虚方法调用特性可以让我们写出非常灵活的代码,大大减少由于系统功能“”扩充和改变所带来的大量代码修改工作量由此给出结论面向对象语言拥有的虚方法调用特性,使我们可以只用同样的一个语句,在运行时根据对象类型而执行不“同的操作”
三、抽象抽象类与抽象方法在一个类前面加上关键字,此类就成为了抽象类对应地,一个方法类前
1.面加上关键字,此方法就成为了抽象方法注意抽象方法不能有实现代“abstract”码,在函数名后直接跟一个分号抽象类专用于派生出子类,子类必须实现抽象类所“abstract”声明的抽象方法,否则,子类仍是抽象类抽象类一般用于表达一种比较抽象的事物,而抽象方法则说明此抽象类应该具有的某种性质,从同一抽象类中继承的子类拥有相同的方法(即抽象类所定义的抽象方法),但这些方法的具体代码每个类都可以不一样抽象类不能创建对象,一般用它来引用子类对象一个抽象类中可以包含非抽象的方法和字段因此包含抽象方法的类一定是抽象类,但抽象类中的方法不一定是抽象方法除了方法可以是抽象的之外,属性也可以是抽象的接口接口可以看成是一种纯的抽象类,它的所有方法都是抽象方法抽象类定义了对
2.象所属的类别,而接口实际上定义了一种对象应具有的行为特性某个类可以实现“”多个接口,当创建一个此类的对象之后,通过引用这个对象的对象变量可以访问其所有的公有方法(包括自身的公有方法以及由接口定义的公有方法以)在这种情况下,根本分不清哪些方法是由接口定义的,哪些是由类自己定义的提供了一种显式接口实现机制,可以区分开这两种情况由此得到一个结论如果一个类显式c#实现某个接口,则只能以此接口类型的变量为媒介调用此接口所定义的方法,而不“”允许通过类的对象变量直接调用或者这样说被显式实现的接口方法只能通过接口实例访问,而不能通过类实例直接访问
四、多态方法重载属于多态的一种,两个构成重载关系的函数必须满足几个条件函数名相同、参数类型不同,或参数个数不同具体调用哪个方法要看参数,需要注意的是,方法返回值类型的不同不是方法重载的判断条件多态编程的基本原理是使用基类或接口变量编程在多态编程中,基类一般都是抽象基类,其中拥有一个或多个抽象方法,各个子类可以根据需要重写这些方法或者使用接口,每个接口都规定了一个或多个抽象方法,实现接口的类根据需要实现这些方法因此,多态的实现分为两大基本类别继承多态和接口多态接口多态与继承多态接口多态与继承多态其编程方式与作用都是类似的但由于一个类可以实现多个接
1.口,所以,接口多态较继承多态更灵活,因而在编程中也用得更广多态是面向对象技术中最精华的部分之一大量的精巧软件设计方案都建立在对多态特性的巧妙应用上在编程中应用多态,可以将其简化为两句应用继承实现对象的统一管理;应用接口定义对象的行为特性对比传统的不使用多态的编程方式,使用多态的好处是当要修改程序并扩充系统时,需要修改的地方较少,对其他部分代码的影响较小
五、类与对象类是面向对象编程的基本单元,与使用语言等结构化编程语言不一样,使用编程,所有的程序代码几乎都放在类中,不存在独立于类之外的函数一个类可以包含c c#两种成员静态成员和实例成员,静态成员是供类的所有对象所共享的,而实例成员只供某一个对象所有实例成员与静态成员的访问规则位于同一类中的实例方法可直接相互调用;类的字段(包括实例字段和静态字段)可以被同一类中的所有实例方法直接访问;类中的静态方法只能直接访问类静态字段类中包括方法和字段,属性是一种特殊的字段,它可以保证数据的合法性,方法和字段这两个概念是面向对象理论的术语,是通用于各种面向对象语言的字段()代表了类中的数据,在类的所有方法之外定义一个变量即定义了一个字段在变量之前可以加上、和表示字段的访问权限方法field()功能代码的集合,在程序开发过程中,经常发现多处需要实现或调用某一public privateprotected个公用功能,这些功能的实现都需要书function写若干行代码如果在调用此功能的地方重复书写这些功能代码,将会使整个程序中代码大量重复,会增大开发工作量,增加代码维护的难度为了解决代码重复的问题,绝大多数程序设计语言都将完成某一公用功能的多个语句组合在一起,起一个名字用于代表这些语句的全体,这样的代码块被称为函数()引入函数概念之后,程序中凡需要调用此公用功能的地方都可以只写出函数名,此名字就代“function”“”表了函数中所包含的所有代码,这样一来,就不再需要在多个地方重复书写这些功能代码对象是以类为模板创建出来的类与对象之间是一对多的关系在中,使用关键字创建对象在程序中活跃的是对象而不是类在面向对象领域,对象有时又c#new被称为是类的实例,对象与类的实例这两个概念是等同的“”
六、值类型与引用类型“”“”“”值类型值类型变量与引用类型变量的内存分配模型也不一样每个正在运行的程序都对应
1.着一个进程(),在一个进程内部,可以有一个或多个线程(),每个线程都拥有一块自留地,称为线程堆栈,大小为,用于保存自身的一些数据,比process thread如函数中定义的局部变量、函数调用时传送的参数值等,这部分内存区域的分配与“”“”1m回收不需要程序员干涉所有值类型的变量都是在线程堆栈中分配的值类型共有三种简单类型、枚举类型和结构类型引用类型另一块内存区域称为堆(),在这种托管环境下,堆由进行管理,所以
2.又称为托管堆()用关键字创建的类的对象时,分配给对象的“heap”.net clr内存单元就位于托管堆中在程序中我们可以随意地使用关键字创建多个对“managedheap”new象,因此,托管堆中的内存资源是可以动态申请并使用的,当然用完了必须归还打new个比方更易理解托管堆相当于一个旅馆,其中的房间相当于托管堆中所拥有的内存单元当程序员用方法创建对象时,相当于游客向旅馆预订房间,旅馆管理员会先看一下有没有合适的空房间,有的话,就可以将此房间提供给游客住宿当游new客旅途结束,要办理退房手续,房间又可以为其他旅客提供服务了引用类型共有四种类类型、接口类型、数组类型和委托类型所有引用类型变量所引用的对象,其内存都是在托管堆中分配的严格地说,我们常说的对象变量其实是类类型的引用变量但在实际中人们经常将引用类型的变量简称为对象变量,用它来指代所“”有四种类型的引用变量“”
七、命名空间与类库命名空间在使用面向对象技术开发的现代软件系统中,经常拥有数百甚至上千个类,为了方
1.便地管理这些类,面向对象技术引入了命名空间()的概念命名空间可以看成是类的容器,它可以包含多个类使用命名空间来管理所有“namespace”的类如果把类比喻成书的话,则命名空间类似于放书的书架,书放在书架上,类放“”.netframework在命名空间里当我们去图书馆查找一本书时,需要指定这本书的编号,编号往往规定了书放在哪个书库的哪个书架上,通过逐渐缩小的范围图书馆书库书架,最终可以在某个书架中找到这本书类似地,可以采用图书馆保存图书类似的方法来--管理类,通过逐渐缩小的范围最大的命名空间子命名空间孙命名空间,最终找到一个类--„„类库为了提高软件开发的效率,人们在整个软件开发过程中大量应用了软件工程的模块
2.化原则,将可以在多个项目中使用的代码封装为可重用的软件模块,其于这些可复用的软件模块,再开发新项目就成为重用已有模块,再开发部分新模块,最后将新旧模块组装起来的过程整个软件开发过程类似于现代工业的生产流水线,生产线“上的每个环节都由特定的人员负责,整个生产线上的工作人员既分工明确又相互合”作,大大地提高了生产效率在组件化开发大行其道的今天,人们通常将可以重用的软件模块称为软件组件在全面向对象的软件平台之上,软件组件的表现形式为程序集(),可以通过在中创建并编译一个类库项目得到一“”.net个程序集在的项目模板中,可以很方便地创建类库()项assembly visualstudio目,会自动在项目中添加一个名为的类文件,程序员可在此visualstudio classlibrary类文件中书写代码,或者添加新的类一个类库项目中可以容纳的类数目没有限制,visualstudio class
1.cs但只有声明为的类可以被外界使用类库项目编译之后,会生成一个动态链接库()文件这就是可以被重用的软件组件程序public集默认情况下,类库文件名就是项目名加上后缀每个类库项目都拥有一个dll dynamiclinklibrary.net——默认的命名空间,可以通过类库项目的属性窗口来指定需要仔细区分类库项目、“.dll”程序集和命名空间这三个概念的区别“”()每个类库项目编译之后,将会生成一个程序集“”“”()类库项目中可以拥有多个类,这些类可属于不同的命名空间1()不同的类库项目可以定义相同的命名空间2根据上述三个特性,可以得到以下结论命名空间是一个逻辑上的概念,它的物理3载体是程序集,具体体现为(或)文件在中,可通过创建类“”库类型的项目生成程序集一个程序集可以有多个命名空间,而一个命名空间也可“”“dll”exe visualstudio“以分布于多个程序集一旦生成了一个程序集,在其他项目中就可以通过添加对这”一程序集的引用而使用此程序集中的类其方法是在项目菜单中选择添加程序集命令,激活浏览卡片,选择一个现有的程序集文件(或)一个项目添加“”“完对特定程序集的引用之后,就可以直接创建此程序集中的类了,当然要注意指明”“”dll exe其命名空间
八、委托委托是一种新的面向对象语言特性,在历史比较长的面向对象语言比如中并未出现过微软公司在设计运行于平台之上的面向对象语言(如和c++)时引入了这一新特性委托()也可以看成是一种数据类型,.netframework c#可以用于定义变量但它是一种特殊的数据类型,它所定义的变量能接收的数值只visualbasic.net delegate能是一个函数,更确切地说,委托类型的变量可以接收一个函数的地址,很类似于++语言的函数指针简单地说委托变量可看成是一种类型安全的函数指针,它只c能接收符合其要求的函数地址委托可以看成是一个函数的容器,将某一具体的函数装入后,就可以把它当成函数一样使用定义委托类型时对函数的要求被称“”为函数的签名()函数的签名规定了函数的参数数目和类型,以及函数“”的返回值,体现了函数的本质特征每一个委托都确定了一个函数的签名拥有不同“signature”签名的函数不能赋值给同一类型的委托变量因此,一个委托类型的变量,可以引用任何一个满足其要求的函数委托的组合与分解
1.委托变量可以代表某一函数,使用委托变量就相当于调用一个函数如果仅是这么简单,那么直接调用函数不就行了吗为什么还要引入委托这一特性事实上,委托不仅可以代表一个函数,还可以组合一堆的函数,然后批量执行它们,这样的委托变量“”又称为多路委托变量可以用加法运算符来组合单个委托变量为多路委托变量“”类似地,也可以使用减法运算符来从一个多路委托变量中移除某个委托变量“”事件与多路委托事件的主要特点是一对多关联,即一个事件源,多个响应者在具体技术
2.上,的事件处理机制是基于多路委托实现的事件与多路委托其实大同小异,只不过多路委托允许在事件源对象之外激发事件罢了所有.netframework的可视化窗体控件的预定义事件,都是某一对应的事件名+委托类型的变量与此事件相关的信息都封装在事件名+类型的事件.netframework“参数中,此事件参数有一个基类,它是所有事件参数的基类明了上述内handler”“args”部机理,对于我们在程序中定义自己的事件非常有好处,尤其是开发一个自定义的eventargs可视化控件时,如果需要增加新的事件类型,我们应尽量遵循的定义事件的框架,给事件取一个名字,定义一个事件名+的事件委托类型,再.netframework从派生出自定义事件的参数,取名为事件名+“handler”面向对象的软件系统有许多都是事件驱动的,就采用了事件驱动的编程方eventargs“args”式所谓事件驱动的开发方式,就是指整个系统包含许多的对象,这些对象可以引asp.net“”发多种事件,软件工程师的主要开发工作就是针对特定的事件书写代码响应它“”们事件处理机制建立在委托的基础之上,而这两者都是技术的基础之一因此,必须牢固地掌握好委托和事件这两种编程技术,才能为掌握技术.net asp.net扫清障碍asp.net。
个人认证
优秀文档
获得点赞 0