先看段代码:
<!--- Animal Class --->
<cfcomponent displayname="Animal Class">
<cffunction name="isCarnivorous" access="public" returntype="boolean">
<cfreturn true/>
</cffunction>
<cffunction name="isPolyphagia" access="public" returntype="boolean">
<cfreturn true/>
</cffunction>
<cffunction name="says" access="public" returntype="string"></cffunction>
</cfcomponent>
<!--- Dog Class --->
<cfcomponent displayname="Dog Class" extends="Animal">
<cffunction name="says" access="public" returntype="string">
<cfreturn "wang wang wang"/>
</cffunction>
<cffunction name="isPolyphagia" access="public" returntype="boolean">
<cfreturn false/>
</cffunction>
</cfcomponent>
<!--- Chicken Class --->
<cfcomponent displayname="Chicken Class" extends="Animal">
<cffunction name="says" access="public" returntype="string">
<cfreturn "ji ji ji"/>
</cffunction>
<cffunction name="isCarnivorous" access="public" returntype="boolean">
<cfreturn false/>
</cffunction>
</cfcomponent>
<!--- test.cfm --->
<cfscript>
dogObj=CreateObject("component","Dog");
chickenObj=CreateObject("component","Chicken");
writeOutput("a dog says:"&dogObj.says()&",is carnivorous:"&dogObj.isCarnivorous()&",is a polyphagia:"&dogObj.isPolyphagia()&"<br/>");
writeOutput("a chicken says:"&chickenObj.says()&",is carnivorous:"&chickenObj.isCarnivorous()&",is a polyphagia:"&chickenObj.isPolyphagia());
</cfscript>
上面的代码定义了一个父类Animal,它有三个方法isCarnivorous(),isPolyphagia(),和says()。Dog类和Chicken类都是Animal类的子类。因为isCarnivorous()和isPolyphagia()都返回true,而dog为食肉性动物,要重载isPolyphagia()返回false,相反的,Chicken为杂食性动物,要重载isCarnivorous()返回false。
而每个动物都有自己独特的发声方式,所以Dog和Chicken子类都必须重载says()方法,这就是父类Animal中定义的says()方法没有函数体的原因,因为它是抽象的。
test.cfm运行后将得到下面的结果:
a dog says: wang wang wang, is carnivorous: true, is polyphagia: false
a chicken says: ji ji ji, is carnivorous: false, is polyphagia: true
总结:子类重载它们父类的方法的能力就是多态.多态使得子类能够使用父类的方法或是在这些方法不足的时候重载它们.这就实现了代码重用,加快了代码的实现过程,而且它还隔离了程序中的bug,使得程序的维护更容易.
另:这里还有篇关于ColdFusionMX多态性的文章: