面向对象的方法的基本思想是从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式。面向对象方法强调直接以问题域(现实世界)中的事物为中心来思考问题、认识问题,并根据这些事物的本质特征,把它们抽象地表示为系统中的对象,作为系统的基本构成单位,而不是用一些与现实世界中事物相差较远,并且没有对应关系的其他概念来构造系统。
面向对象的基本概念
在面向对象的设计方法中,对象和传递消息分别是表现事物及事物间相互联系的概念。类和继承是适应人们一般思维方式的描述范式。方法是允许作用于该类对象上的各种操作。
对象
对象是一个实体,它能够保存一个状态(或称信息或数据),并且能提供一系列操作(或称行为),这些操作或能检查或能影响对象的状态。对象能够表示现实或抽象的事物,具有良好定义的责任和良好定义的行为,以及良好定义的接口。对象通常不是太复杂或太大。一个对象可以由多个对象组成,并且与其他对象具有松散耦合。
类和实例
具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。具体来说,类由方法和数据集成,它是关于对象性质的描述,包括外部特性和内部实现两个方面。
在面向对象的系统中,每个对象都属于一个类,属于某个类的对象称为该类的一个实例,类和对象间具有instance-of关系。一个实例是从一个类创建而来的对象,类描述了这个实例的行为及结构。在面向对象的程序设计语言中,类的实例既可静态的产生也可动态的产生。
面向对象的基本特征
在面向对象的设计方法中,对象、类、消息和方法的程序设计范式的基本点在于对象的封装性和继承性。通过封装能将对象的定义和对象的实现分开,通过继承能体现类与类之间的关系,以及由此带来的动态绑定和实体的多态性,从而构成了面向对象的各种特征。面向对象的三大特点(封装,继承,多态)缺一不可。
继承性
继承是一种使用户得以在一个类的基础上建立新的类的技术。新的类自动继承旧类的属性和行为特征,并可具备某些附加的特征或某些限制。新类称作旧类的子类,旧类称作新类的超类。
继承性是面向对象程序设计语言不同于其他语言的最主要特点,是其他语言所没有的。正因为继承机制才使得子类的对象也是超类的对象,所以所有发给超类对象的信息,子类对象也可以接收。例如类“cycle”是类“shape”的子类,所以一个cycle对象可以接收发给shape对象的消息。子类和继承是两个不可分割的概念,继承是在类、子类以及对象间共享数据和方法的一种重用性机制。
如下图,如果类C能使用类B中的方法及属性,称B是C的超类(superclass),C是B的子类(subclass),也称类C继承类B。类间的继承关系是可以传递的:如果C的超类是B,B的超类是A,则A是C的间接超类,C是A的间接子类。而B是C的直接超类,C是B的直接子类。
继承可以分为单继承和多继承,如果一个类只有一个直接超类,则这种继承叫做单继承,如果一个类有多于一个的直接超类,这种继承叫多继承。
封装性
在面向对象的方法中,所有信息都存储在对象中,即其数据及行为都封装在对象中。封装是一种信息隐蔽技术,用户只能看到对象那个封装界面上的信息,对象内部对用户来说是隐蔽的。
封装是面向对象方法的一个重要原则,它有两个含义:第一个含义是,把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象);第二个含义也称做信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外接口使之与外部发生联系。
封装的目的在于将对象的使用者和对象的设计者分开,使用者不必知道行为实际的细节,只须用设计者提供的信息来访问该对象。
多态性和重载
在收到消息时对象要予以响应,不同的对象收到同一消息可以产生完全不同的结果,这一现象叫做多态。类的继承与多态结合后,将进一步增强软件的重用性。
多态主要包括以下内容:
运算符重载:同一运算符可用于不同的变量类型,称作运算符重载。
即席多态:即席多态也称操作名多态。同一操作名可作用于不同对象上并产生不同的结果。
类属软件的重用:类的继承与多态密切相关,作用于超类实例的方法同样也可以作用于其子类的实例。超类的方法不仅可由已存在的子类所重用,而且还可以由新创建的子类所重用。
面向对象方法学优缺点
▷优点
与人类习惯的思维方法一致
稳定性好
可重用性好
可扩展性
可维护性
▷缺点
面向对象需要更关注于需求、分析和设计
面向对象需要完全改变每个人的思想
面向对象需要改变软件开发文化
面向对象不仅仅是编程
面向对象的许多优点是长期的
面向对象要求先在培训、教育和工具上投资
面向对象技术不能保证能构造出正确的系统
面向对象要求更多的测试工作
面向对象仅是解决方案的一部分