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特性_第1张图片

       类的继承

       在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 返回类型 方法名称(参数列表)

        {  }

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

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

  

       

 

 

 

 

 

 

你可能感兴趣的:(.net,编程语言,C#,oop,framework,Class)