`

OO的基本概念---------多态性

阅读更多

OO五大原则:

SRPOCPLSPDIPISP

SRPSingle Responsibility Principle 单一职责原则)

对象的功能应该单一

 

OCPOpen Close Principle 开闭原则)

对修改关闭,对扩展打开

 

LSPLiskov Substitution Principle 里氏替换原则)

“老鼠的儿子会打洞”,子类应该具备父类的特征。

 

DIPDependence Inversion Principle 反向依赖原则)

不应该依赖“客户”的东西,后端提供方法不应该依赖前端对象。

 

ISPInterface Segregation Principle 接口分隔原则)

尽量提供有针对性符合功能特点的简单接口,而不是包含很多方法的大而总接口。

 

多态性(polymorphism)是面向对象编程的属性,它允许多个方法使用同一个接口。Java从多个方面支持多态性,其中两个方面最为突出。第一个是每个方法(标记为 final的方法除外)都可以被子类重写;第二个是设立interface关键字。

超类中的方法可以在派生类中重写,在类的层次结构中,每个子类都将它的超类特化(sepcialization)。超类的一个引用可以引用它的任何一个子类,而且通过超类的引用调用某子类对象的一个方法时,会自动执行由该子类重写后的版本。因此,可以用超类来定义对象的形式并提供对象的默认实现,而子类根据这种默认实现进行修改,以更好地适应具体情况的要求。因此,在超类中定义的一个接口可以作为多个不同实现的基础。

Java进一步采取了“一个接口,多个方法”的概念。它定义了interface关键字,这样就可以将类的方法和类的实现完全分离。尽管接口是抽象的,但是仍然可以声明接口类型的引用。这个概念非常重要,因为它可以改进多态性的应用。只要某个类实现一个接口,并且该接口提供了某种功能,那么任何需要这种功能的代码都可以使用这个类的对象。例如,假设某个接口的名称为myMethod,考虑下面的方法:

 

  void myMethod(MyClass ob) { //....}

 

  任何实现了MyClass 接口的对象都可以传递给myMethod()方法。该对象的其他功能无需考虑。myMethod()方法可以对任何实现了MyClass 接口的对象进行操作

 

解析抽象类和接口的区别

Abstract classinterface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换.但两者存在很大的区别:

抽象类:在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的,

在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类

 

从语法定义层面看abstract classinterface 

abstract class方式中,它可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,它只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class           

 

从编程的角度来看

首先,abstract classJava语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface

其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。

 

从设计理念层面看abstract classinterface

Abstract classinterface所反映出的设计理念,来分析一下二者的区别。

前面已经提到过,abstarct classJava语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的

 

对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics