C#拾遗之类的OOP特性

OOP概述

OOP不仅是一项具体的软件开发技术,而且是一整套关于如何看待软件系统与现实世界关系,以何种观点来研究问题并进行求解以及如何进行系统构造的软件方法学。

OOP方法的出现弥补了传统方法的不足,首先着眼于实际问题中所涉及的对象,包括各种客观实体及事件等,为解决问题设计所需的,各种对象以及对象的属性,必要的操作和各个对象之间的关系,从而构建出对象的结构和为解决问题需要执行的事件序列(俗称脚本)。通过各个对象之间的消息连接,建立所需的功能。

OOP方法中类的定义充分体现了抽象数据类型的思想,基于类的体系结构可以把程序的修改局部化。特别是一旦系统功能需要修改时,主要修改类中的某些操作,而类所代表的对象基本不变,保持整个系统仍然稳定。

OOP方法的优点:

(1)与人类习惯的思维方式一致。人的认识过程是从一般到特殊的渐进思维过程。OOP的方法顺应了这个规律,从寻找要求解的对象“是什么?”开始,认识事物属性及其本质规律,主观随意性受到限制。而传统方法是从“怎样做?”开始,主观随意性较大。

(2)稳定性好。传统方法主要面向过程,完全基于系统的功能和性能分析。当功能需求发生变化时,将引起对软件整体结构的修改。OOP方法以“对象”为中心。在分析,研究对象及其属性的过程中,根据其内在规律建立求解模型。基于这种方法建立的软件系统,不管外部环境或功能需求如何变化,而对象内在的规律不变,因而不会引起软件结构的整体变化,所以系统是稳定的。

(3)可重用性好。继承是OOP方法的一个重要机制。用OOP方法设计的系统,其基本对象类可以被其他新系统重用。通常这是通过一个包含类和子类层次结构的类库来实现的。

(4)可维护性好。由于稳定性较好,即使进行局部修改,也不影响全局:由于对象具有封装性和信息隐藏机制,使得程序便于修改:系统功能的扩充,往往是通过在原有类的基础上派生一些新的子类来实现,易于融会贯通:同样,由于派生类继承原有类的特性,系统也易于测试和调试,从而使系统具有较好的可维护性。

(5)表示方法的一致性。传统的结构化分析和设计方法中存在截然不同的表示方法。例如在分析阶段采用数据流程图表示,在设计阶段则采用结构图的表示方法。OOP方法在系统的整个开发过程中,从OOA到OOD,直到OOP,采用一直的表示方法,从而加强了分析,设计和编程之间的内在一致性,并且改善了用户,分析员,设计员以及程序员之间的信息交流。

类的OOP特性

类的封装

如果用户希望确保一个类不被作为基类使用,那么就在定义这个类时使用sealed关键字。唯一的限制是抽象类不能作为封闭的类使用,因为抽象类的本质决定它们必须被作为基类使用。封闭类的作用是防止意外的派生操作。具体地说,因为编译器确定这个类没有任何派生类,所以可以将封闭实例上的虚函数成员调用转换为非虚函数调用。

例题,使用关键字sealed修饰类进行一系列的程序调试有如下的结果

类的继承

在C#编程语言中,除了密封类以外,绝大部分的类都可以继承。在OOP编程体系中,继承是一个重要的概念,对于类而言,所谓继承,就是子类包含父类的数据结构和行为方式,包括字段,属性,方法和事件。尽管在子类本身的定义中没有包含这些定义,但仍然可以使用这些父类成员。

在类的继承中,被继承的类叫做基类或父类,继承的类叫做派生类或子类。

当一个类从另一个派生出来时,派生类就自然具有基类数据成员,属性成员和方法成员等,基类定义中这些成员的代码,已不需要在派生类定义中重写,在派生类的定义中,只需编写基类定义中所不具有的代码即可。这样,既提高了代码的重要性,也提高程序设计的效率,又为程序设计中的特别需要提供了编写代码的自由空间,从而提高了已有程序设计成果的可扩展性。

在C#中,类的继承遵循以下规则:

(1)派生类只能继承一个基类

(2)派生类自然继承基类的成员,但不能继承类的构造函数成员

(3)类的基础可以传递,假设C类继承B类,B类继承A类,那么C类具有B类和A类的成员,在C#中,Object类是所有类的基类,也就是所有的类都具有Object类的成员。

(4)派生类是对基类的扩展,派生类定义中可以声明新的成员,但不能消除已继承的基类成员。

(5)基类中的成员声明时,不管其是什么访问控制方式,总能被派生类继承,访问控制的不同只决定派生类成员是否能够访问基类成员。

(6)派生类定义中如果声明了与基类同名的成员,则基类的同名成员将被覆盖,从而使派生类不能直接访问同名的基类的成员。

(7)基类可以定义虚方法成员等,这样派生类能够重载这些成员以表现类的多态性。

派生类通常定义的格式为:

访问控制修饰符  class  派生类名称: 基类名称

{

类体

}

访问控制修饰符可以是public,protected和private。通常都是用public以保证类的开放性,并且public可以省略,因为类定义的访问控制默认为public。“:基类名称”,表示所继承的类。

基类与派生类定义完成后,用派生类声明的对象将包含基类的成员(除了构造函数),因此,派生类对象可以直接访问基类成员。在创建派生类对象时,调用构造函数的顺序是先调用基类构造函数,再调用派生类的构造函数。以完成为数据成员分配内存空间并进行初始化的工作。

向基类构造函数传递参数,必须通过派生类的构造函数实现,格式为:

public 派生类构造函数名(形参列表) base (向基类构造函数传递的实参列表)

{   }

"base"是C#关键字,表示调用基类的有参数构造函数,传递给基类构造函数的“实参列表”通常包含在派生类构造函数的“形参列表”中。

在上述的程序例题中去掉sealed关键字,则就是一个类的继承的程序代码例题。

类的多态

在类的继承中,C#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,也就是说在基类与派生类的相同功能中可以有不同的实现方法,从而为解决同一问题提供多种途径。

多态性就是指在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型不同完成方法的不同的具体实现。

在C#可以通过多种途径实现多态性。

(1)虚方法

在派生类中用new关键字声明与基类同名的方法的格式为:

public new 方法名称(参数列表)

{   }

在基类中的声明格式如下:

public virtual 方法名称(参数列表)

在派生类中的声明格式为:

public  override 方法名称(参数列表)

在派生类中声明与基类同名的方法,也叫方法重载。在派生类重载基类方法后,如果想调用基类的同名方法,可以使用base关键字。如果基类与派生类都有一个无参数Show方法。

在基类中的Show方法的声明格式:Show()

在派生类中的Show方法的声明格式:base Show()

(2)抽象类与抽象方法

为了实现多态,必须在基类声明虚方法,但有时基类中声明的虚方法无法实现具体的功能。这时需要在基类中声明抽象方法。抽象类是指基类的定义中声明不包括任何实现代码的方法,实际上就是一个不具有任何具体功能的方法。这样的方法唯一的作用就是让派生类重写。

在基类定义中,只要类体中包含一个抽象方法,就将该类称为抽象类,在抽象类中也可以声明一般的虚方法。

1声明抽象类与抽象方法

声明抽象类与抽象方法均需使用关键字abstract,格式为:

public  abstract  class 类名称

{

public abstract 返回类型 方法名称 (参数列表)

}

抽象方法不是一般的空方法,抽象方法声明时,没有方法体,只在方法后跟一个分号。

2重载抽象方法

当定义抽象类的派生类时,派生类自然从抽象类继承抽象方法成员,并且必须重写抽象类的抽象方法,这是抽象方法与虚方法的不同,因为对于基类的虚方法,其派生类可以不必重写   。重写抽象类方法必须使用override关键字。

重载抽象方法的格式为:

public  override 返回类型 方法名称(参数列表)

{  }

其中 ,方法名称与参数列表必须与抽象类中的抽象方法完全一致。

对于这方面的程序例题在以后的具体实例再做充分的分析。

时间: 2024-08-01 10:44:06

C#拾遗之类的OOP特性的相关文章

.NET基础拾遗(6)特性

1 神马是特性?如何自定义一个特性? (1)特性是什么 CLR允许添加类似关键字的描述声明叫做attributes, 它对程序中的目标元素进行标注,如类型.字段.方法和属性等. Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码或者在程序运行的时候影响应用程序的行为. 总结为:定制特性attribute,本质上是一个类,为目标元素提供关联附加信息并在运行期以反射的方式来获取附加信息. 定制特性可应用的目标元素:程序集(ass

使用JavaScript OOP特性搭建Web应用

最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 JavaScript 知之甚少.话虽这样说,但我确实没有责备她的意思.JavaScript 真的是很有趣.很多人(包括我自己,直到最近!)都认为自己很擅长 JavaScript 语言,因为他们都知道 C/C++/C#,或者有一些以前的编程经验. 在某种程度上,这种假设并不是完全没有根据的.用 Java

LUA OOP编程实现方法

lua原生不支持OOP特性 确实如此, 同时可以采用其它lua代码的方式实现OOP的特性. OOP四大特性 抽象 封装 继承 多态 http://www.cnblogs.com/xiaosongluffy/p/5072501.html 四大基本特性: 抽象:提取现实世界中某事物的关键特性,为该事物构建模型的过程.对同一事物在不同的需求下,需要提取的特性可能不一样.得到的抽象模型中一般包含:属性(数据)和操作(行为).这个抽象模型我们称之为类.对类进行实例化得到对象. 封装:封装可以使类具有独立性

c++编程思想(一)--对象导言

回过头来看c++编程思想第一章,虽然只是对c++知识的一个总结,并没有实质性知识点,但是收获还是蛮多的! 下面感觉是让自己茅塞顿开的说法,虽然含义并不是很准确,但是很形象(自己的语言): 1.类描述了一组具有相同特性(数据元素)和相同行为(功能)的对象,本质就是一个数据类型,已存在的数据类型只是表示计算机的存储单位,定义新的类就是为了与问题结合,解决问题-----不要把类想的很复杂,直接抽象成这样 2.类要产生工作,会有一个接口,来实现功能 3.程序猿分为类创建者和客户程序猿(调用别人的类).客

《C和C++程序员面试秘笈[精品]》-笔记

2015-12-16 原文:在C++中可以通过域操作符"::"来直接操作全局变量 2015-12-16 原文:后缀式(i++)必须返回对象的值,所以导致在大对象的时候产生了较大的复制开销,引起效率降低.因此处理使用者自定义类型(注意不是指内建类型)的时候,应该尽可能地使用前缀式递增/递减,因为它天生"体质"较佳. 2015-12-16 原文:内建数据类型的情况,效率没有区别. 自定义数据类型的情况,++i效率较高. 2015-12-16 原文:当表达式中存在有符号类

pythoning ——1、基础篇

1.python之禅 原文:http://blog.csdn.net/gzlaiyonghao/article/details/2151918 The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is bette

C++ STL轻松导学

作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的.STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙 花一现.本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情. 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL "什么是STL?",假如你对STL还知之甚少,那么我想,你一定很想知 道这个问题的答案,坦率地讲,要指望用短短数言将这个问题阐述清楚,也决非易事.因此,如果

Go初探

官方网站:https://golang.org/ 标准库文档:https://golang.org/pkg/ 在线编码学习:https://play.golang.org/ PS:请自行FQ 简介安装Hello World 实例编译基础语法行分隔符注释标识符关键字数据类型指针类型(Pointer)数组(Array)结构化类型(struct)接口类型(interface)Map 类型Any类型类型转换类型增加方法变量作用域值类型和引用类型常量iota运算符运算符优先级条件与循环语句函数返回多个值参

从头开发MUDLIB

跟Akuma一起从头打造mudlib--[第一讲] 第一讲:让它跑起来注:每一讲我都会上传一个相符的lib,有些文件是旧的,有些是新的,我尽可能在lib里写清楚注释.更详细的内容则在每讲的正文里写. 一个最简单的能跑的lib应该长成什么样子?每个基于mudos写lpc的人可能都会给出不同的答案.我记得曾经有个朋友释出过一个不到5k的lib. 我这个则还要小一点,tgz之后是1851个字节.嗯...还好.我们对这个lib基本上不会有什么期待,但是他至少应该完成如下两个事情:1.能跑起来,并且接受用