基于C#面向对象程序设计的封装、继承和多态分析
2021-11-21占梅
占梅
(厦门南洋职业学院 福建省厦门市 361102)
面向对象具有封装、继承、多态三大特征,这些特性主要通过类来体现。封装可以隐藏实现细节,其能够在所对应对象中对具体事物属性及行为进行包装,但该对象仅能够将部分属性及行为对外进行有选择性的公布,导致代码模块化。继承是一个面向对象的词语。说明一个类(派生类)能分享其它类(基类)的特征和行为,其子对象能够继承父对象所拥有的属性及行为,继承也能够扩展自身已存在的代码模块(类)。多态就是相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。其中封装及继承的目的均是为了能够使代码可以重复使用。
1 对象的封装
1.1 封装的概念
对抽象获得数据及功能等进行结合形成有机整体的过程即为封装,其实质上是数据与操作数据源代码两者的结合,也是一个面向对象的概念,对外部世界隐藏类的内部,类的成员包括数据与函数。数据的安全性及编程简化处理都有赖于封装实现,因此在对封装进行实践应用时无需详细了解其步骤,只需要通过外部接口对类成员赋予特有的访问权限便能够使用。封装在面向对象程度中主要目的是防止对实现细节的访问。封装不仅可以封装成员变量,还可以封装成员方法。
1.2 封装的实现
(1)封装的具体实现需要遵循一定的原则,隐藏无需对外提供的内容,包括属性等,并详细说明公共方法便于对其访问。
(2)作为一种权限修复符,private 关键字能够对成员变量及成员方法进行相应的修饰,但需要注意的是被修饰成员的访问仅能够在本类中进行访问。用private 修饰成员变量,提供对应的get()和set ()方法,private 仅仅是封装的一种体现形式。
2 对象的继承
2.1 继承的概念
继承可以减少代码的冗余,提高软件模块的可复用性和可扩充性,提高软件的开发效率。继承是面向对象编程的组成部分,是所有面向对象的语言都要具备的特性。先将几个类中相同的属性和方法进行抽离,单独定义在一个新建的类中。其他的类直接继承当前新建的类,语法是派生类:基类(或者是子类:父类),派生类可以直接使用基类中允许使用的属性和方法,可以使用base 关键字直接访问基类的属性和方法(成员变量)。在C#中派生类中,能够由基类完成对方法、属性、事件以及索引指示器等的继承,但无法对构造函数、折构函数进行继承。派生类对基类成员的继承主要是采用隐式的方法继承的。
2.2 继承的实现机制
2.2.1 可传递性
继承在实施过程中具有一定的可传递性,如B 派生了C,而A又能够派生B,由此可以发现C 不仅属于B 中声明成员,其同时也是A 成员,所有类基类均为Object 类。
2.2.2 可扩展性
继承时可以使用现有类的所有功能,在无需重新编写原来类的情况下即可对这些功能进行扩展。其具有添加新成员的功能,但无法将继承成员去除。
2.2.3 访问方式可设定性
不能被继承的函数还包括构造函数、析构函数,另外的成员尽管访问方式不同都能够得到继承,通常,基类成员采取不同的访问方式主要是目的是明确是否可以通过派生类进行访问。
2.2.4 可覆盖性
派生类若将新成员定义为与基类成员同名时,能够对已继承成员名进行覆盖,但是覆盖并不是删除,而是限制了对同名成员的访问。
2.2.5 可重载性
通常,虚方法、虚属性包括虚索引指示器的定义都可以通过类实现,基于其派生类功能,能够实现对上述成员的重载,呈现出多态性特征。
2.2.6 可多级继承性
一般情况下,派生类的继承仅能够通过一个类完成,其多重继承则需要利用接口技术。
2.3 访问与隐藏基类成员
2.3.1 使用base 访问基类成员
对基类成员的访问主要利用的是base 关键字,若基类中存在被其他虚拟方法重写的方法,那么可以对基类进行调用,构造相应的函数。需要注意的是基本访问实现途径主要包括构造函数、实例方法以及实例属性访问器,无法实现静态方法应用 base 关键字访问。若真的需要静态方法则此时需要显式类型转换对基类成员进行访问。
2.3.2 隐藏基类成员
若想隐藏基类成员可采用密封类实现,其主要目的为避免编写的类被继承,或现有的类没有继承的必要。基于这一需求,密封类(sealed class)概念诞生。密封类是不能被继承的类,为了避免从一个类中继承,密封类不能是抽象类,因为抽象类总是希望被继承的。
密封类的应用能够避免继承类,密封方法的提出防止了派生类重载该方法。通常可以采用sealed 修饰符对方法类进行修饰,密封方法覆盖范围较广,通常每个成员方法都可以称之为密封法,且sealed 与override 修饰符能够同时应用。
由基类继承的隐藏成员可以通过 new 修饰符得以显式。当需要对继承成员进行隐藏时,只需在派生类中对相同名称进行声明,并予以 new 修饰符修饰。
3 对象的多态
3.1 多态的概念
在面向对象的系统中,多态性是一个非常重要的概念,使用不同的实例去执行不同的操作,好处就是增强程序的可扩展性及可维护性,使代码更简洁。多态性通过派生类重载基类中的虚函数型方法来实现。在C#中多态性的定义是:在继承关系的前提下,实例化出不同的对象,这些对象调用相同的方法,但是表现出不同的行为,这就叫做多态。而表现不同的行为就是在各个子类中用overide进行重写。在C#语言中,体现多态有三种方式,虚方法、抽象类、接口。在调用时以方法参数区分具体调用哪个方法。运行时的多态性就是虚拟成员在基类中申明了方法、属性、索引器或事件,也就是做一个简单的处理。使用Virtual 关键字将成员申明为虚拟成员。而在声明时,父类的方法前面加上Virtual 关键字,子类的方法前面加上override 关键字,且与父类方法同名,表示父类的方法可以被子类进行修改和重新定义。C#中,运行时的多态性通过虚成员实现。运行时的多态性具有高度灵活和抽象的特点,且必须是虚拟方法,方法的签名必须一致,包括方法名称,参数和参数类型。
多态存在的三个必要条件:继承、重写(子类继承父类后对父类方法进行重新定义)、父类引用指向子类对象。
3.2 多态的实现
3.2.1 通过接口实现多态
通常,多个类可以通过同一“接口”得以实现,单个类也能够保障一个或多个接口的实现。实现类主要是用于部分成员特定实现,包括接口描述类方法、属性和事件等,另外,成员接收、返回参数类型也往往通过实现类完成。
组件编程拥有强大的技能,主要表现为可在同一对象上完成多接口,且每个接口之间的属性及事件组成情况等联系密切。接口实现后,其他组件可对接口提供相应的各项功能,无需对其特定功能做出相应的考虑,后续组件功能丰富,且不会影响到核心功能。如有需求,可以由专业技术开发人员分解组件功能,作为一种单独接口进行实现。
接口的书写格式要求如下:
(1)在接口中,我们使用Interface 关键字来声明一个接口,没有class 名称为"IXxxx";
(2)接口中不能包含字段,但是可以包含属性;
(3)接口中的抽象方法不能有方法体,全是抽象方法,但是又不允许使用abstract 进行修饰;
(4)接口中的成员不允许添加访问修饰符,默认都是public;
(5)最终形成了上面的样式,显得非常的简洁。
接口注意事项:
(1)一个类可实现多个接口,被实现的多个接口用逗号分开;
(2)一个接口可继承多个接口,多个接口间也要用逗号分开;
(3)由于接口中的方法均为抽象方法,所以接口肯定是不能实例化的。
3.2.2 通过继承实现多态
多个类的继承能够通过一个基类完成,完成继承后,不仅能够实现对基类方法、属性及事件的接收,而且能够结合实际需要附加新的成员,对基类成员进行重写,并提供丰富的实现途径与方法。
C#具有多态性的特点,该机制应用于小规模开发任务表现为强大的功能,但在大规模系统应用中尚存在一定的不足,主要表现为对继承驱动多态性过分强调,使得大规模资源由编码转变为设计,对总开发时间缩短无明显的作用。使用继承最为突出的功能即在现有类中进行功能的添加,若基类框架得到充分调试后开始,能够提升程序员工作效率。若应用程序需要对多个相关类进行设计,要实现相关类的共享,那么要应用继承。通常重叠功能的实现多依托基类,而基类又能够派生应用程序中使用的类。
3.2.3 通过抽象类实现多态
作为一种特殊基类,抽象类不仅包含了普通类成员,而且还容纳了大量抽象类成员。所谓抽象类成员,其主要指的是无法被实例化的属性、方法。由抽象类派生的类需要具备抽象属性与方法。抽象类不仅具备继承的功能,而且能够提供接口元素。但需要注意的是抽象类无法实例化,应通过继承发挥作用。类的成员需要通过继承类得以实现。类成员实现后仍有被重写的可能性,且能够完成附加接口或其他功能。
抽象类的继承、接口功能的实现,兼具已实现方法与未实现方法的功能与属性,后者往往需要在继承类中得以实现。因此需要在类方法中添加不变功能,打开针对其他过程的灵活性。抽象类的一大优势如下:在对新版本进行组件时,可结合需求在基类中添加附加方法,但要维持接口不变。抽象类的使用往往为相关组件在保障一组相同功能且在其他方法中保持灵活性时,应用价值高。
抽象类:抽象类使用抽象方法来实现,在C#中,我们规定是无法创建抽象类的实例,严格的说:就算定义的抽象方法中没有写抽象方法,也是无法创建抽象类的实例的;如果能实例出来一个抽象,那么调用这些无方法体的抽象方法是也没有任何意义的,因此抽象类是无法实例化的;还有就是抽象类中不光可以写抽象方法,还可以写普通方法,也可以写虚方法,这也是和接口的区别。
4 封装、继承和多态的优点
4.1 封装的优点
封装具有鲜明的优势,封装良好一方面能够减少耦合,另一方面能够便于自由修改类内部结构,接口清楚,便于对成员的精准控制,使得细节得到隐藏。不仅如此,封装还能够对数据存取与权限问题予以有效的解决,在封装作用下能够隐藏数据,营造密闭空间,在该空间中设置数据访问权限。一个类中包含敏感数据,有些人可以访问,有些人不能访问,如果不对这些数据的访问加以限制,后果将会非常严重。
4.2 继承的优点
减少代码量,实现代码复用。
4.3 多态性优点
消除类型之间的耦合关系;可替换性;可扩充性;接口性;灵活性;简化性。
5 结论
面向对象具有封装、继承及多态三个特征。在封装支持下,能够保障数据安全性,并对编程进行简化处理,在具体应用中无需过分关注其细节,在外部接口作用下,对类成员访问权限进行设置。作为一种层次模型,继承具有重复应用的价值,能够对共性方法进行表述。派生类可和基类有同样名字的成员,实现对基类成员的隐藏,基类方法及实例变量能够得到相应的继承,并结合需求做出相应的修改与增减。其多态性决定了不同类能够实现对同一消息的响应,对应用程度函数同名问题做出相应的解决。