这是参数多态的一个例子吗?

时间:2010-05-23 18:41:14

标签: oop polymorphism dynamic-languages

您好,我正在教育自己的原则。我想知道这是否是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>

2 个答案:

答案 0 :(得分:1)

我不相信这个pp,因为该函数明确地处理了any参数的类型。 pp的要点是函数的工作方式与对象的类型无关。

如果我在系统中引入了一个新类型,这个函数就会破坏,因为它没有特殊处理。

编辑:我认为您更新的示例是子类型多态,因为函数将处理对象及其任何子类型,因为getmetadata处理对象(并且通过替换原则,它是子类型。)

答案 1 :(得分:1)

不,只是没有。

多态性意味着您不必检查某些类型,只需使用它。

一个例子是(C#):

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

Method可以接受从Object继承的任何类型的Object(在C#中几乎所有东西)并且Object实现Equals,因此您可以使用它来进行检查,而不必检查任何参数的类型。 /> 通常您接受某种接口以确保对象支持您要执行的操作。