2010-05-23 41 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