在Java语言中一个类只能继承于一个父类,也就是常说的“Java的子类只有一个爸爸,但是一个爸爸却可以有多个儿子”,这句话很形象,也很生动,但是在程序中如果一个类只能继承于一个父类,那么当一个类需要有多个特性的时候,我们应该怎么办?假设在我们的游戏的中有一个叫“鸡哥”的角色得到了一个叫“天使之翼”的道具,使用该物品的时候可以增加角色“鸡哥”的精力值1000点,使“辉哥”的头上出现发光的光圈,时间持续1小时。这个例子可以简单的用一下的思维导图表示:
但是发光效果只是在“很多” “特殊的道具”才会出现,先在假定长出现发光效果的Java对象的名字为ShiningBuff,而增加角色的精力的物品只用食物,假定食物类的名字叫Food,
它们各自的简化代码如下:
ShiningBuff的示例代码:
Food的示例代码:
我们可以假设现在我们的项目里面只有这两个物品有“增加角色的精力值”和“出现发光光圈”的方法,但是这两个方法存在于不同的类中,如果只继承其中的某一个类我们只能实现这个“特殊物品”的一个属性,要么就是“增加角色的精力值”,要么就是“出现发光光圈”,当然我们也可以重新创建一个类,在这个类中实现上面的两个方法,但是如果你的这样的物品有两个,三个甚至更多,你就要创建更多的类,这样你的方法就达不到重用的目的。怎么办?
我们换个角度来思考这个问题,这个道具无非就是两种效果“增加精力”和“发光”,那么我们就对这两个效果分别定义两个方法,我们就将ShiningBuff中的shiningOnRoleHead()和Food中的addRoleEnergy()两个方法分别拿出来,重新定义,这时候我们就可以定两个接口,一个是“增加精力”,一个是“发光”。简化代码如下:
“增加精力”的接口AddRoleEnergy:
“发光”的接口Shining
这时候我们就可以实现这两个接口来达到我们的目的了,创建一个奇怪的道具类
现在“鸡哥”拿到这个道具的时候就可以正常使用了,呵呵。
但是我们还是回到刚才刚才要实现这两个接口的地方,在那里我们是直接根据物品本身的一些属性来思考如何解决好这个道具的使用问题的,在我们正常的想法中我们都是根据我们已经有的物品,在原有的一些物品上添加一些新的属性和方法,说的简单一点,当我们的项目中有新添加的应用的时候我们首先考虑到的是如何使用现有项目已有的一些特有的属性和功能,并且是在现有的功能的基础上在添加一些新的东西,这样可以想象到我们的扩展行,当我们有些功能在现有的项目中没有的时候我们又应该怎么办,如果不使用接口,只能使我们程序的扩展性变的越来越弱,直至不能在扩展,甚至是颠覆现在已有的东西,重新来做,但是如果我们在开始设计一个项目的时候就想到可能会出现的问题。如上面所说的,那么项目扩展就会变的非常容易,我们假定程序在开始设计的时候就定义好了“发光”和“增加精力值”的接口,那么我们所有具有这些或者部分具有这些功能的物品都可以使用这两个接口,现在再用接口实现上面的ShiningBuff和Food(接口还是使用上面已经定义好的),
这样“增加精力”和“发光”就不再是属于某一个特定的类,而可以成为一种通用的方法。这样对于具有这两种效果的道具只要实现了这两个接口就可以达到目的。
上图显示了整个例子的实现过程,这里只是对接口做了一个简单的介绍,对于接口的特点和实现方式都没有做过多的说明,提供一下几个连接,希望对大家学习接口的能有所帮助。
Java接口概念讲解:
http://hi.baidu.com/kaixuansky/blog/item/d7f36409173417920b7b8249.html