2010-05-23 47 views
0

嗨,我正在教育自己的原則。我想知道這是否是Cardellis定義爲parametric polymorphism的正確示例。請賜教。
該示例位於cfml基於腳本的語法中。這是參數多態性的一個例子嗎?

<cfscript> 
Parent = createobject("component","webapp.model.Parent").init(); 
Child = createobject("component","webapp.model.Child").init(); 
GrandChild = createobject("component","webapp.model.GrandChild").init(); 
Test = createobject("component","webapp.model.DealWithObject"); 
dump(Test.getNumberOfParents(Parent)); 
dump(Test.getNumberOfParents(Child)); 
dump(Test.getNumberOfParents(GrandChild)); 
</cfscript> 

<cfcomponent> 
<cfscript> 
// should deal with an infinte number of abstract data types (because of common structure) 
public numeric function getNumberOfParents(component arg){ 
    return -1 + arraylen(structfindkey(getmetadata(arguments.arg),"extends","all")); 
} 
</cfscript> 
</cfcomponent> 
+4

這個代碼是在每日的WTF上找到的嗎? – Will 2010-05-23 18:43:45

回答

1

沒有,只是(通過置換原則,它的亞型。)沒有。

多態性意味着你不必檢查什麼類型,你只是使用它。

一個例子是(C#):

public Boolean AreEqual(Object o1, Object o2) 
{ 
    return o1.Equals(o2); 
} 

該方法可以接受任何類型的對象(在C#中幾乎所有的東西)繼承對象和對象實現平等相待,所以你可以用它來使檢查並且不必檢查任何參數的類型。
通常您會接受某種界面以確保該對象支持您要執行的操作。

+0

是的,我自己意識到這一點,我改變了這個例子 – mrt181 2010-05-23 19:49:42

1

我不相信這個pp,因爲函數明確地處理了any參數的類型。 pp的要點是該函數不考慮對象的類型而工作。

如果我在系統中引入一個新類型,該函數將會中斷,因爲它沒有特殊處理。

編輯:我覺得你的更新的例子是亞型多態性,因爲該函數將處理對象和任何它的亞型,憑藉該的getMetaData處理對象

+0

是的,我重讀了Cardelli的文章。我想我的例子不好,因爲我使用的是原始數據類型和抽象數據類型。我會改變它。 – mrt181 2010-05-23 19:42:13

+0

不是原始數據類型是問題。每當你開始編寫代碼來檢查傳入的對象是否爲Foo/Bar/Bar類型時,你應該停下來並試圖尋找另一種解決方案(有些特殊情況下這是必要的,但這些是非常非常罕見的,即序列化和ORM需要內部的這些檢查)。 – dbemerlin 2010-05-23 20:14:22

+0

那麼,更新後的示例是否以pp的形式工作? – mrt181 2010-05-23 20:16:41