您好,我正在教育自己的原则。我想知道这是否是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>
答案 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,因此您可以使用它来进行检查,而不必检查任何参数的类型。 /> 通常您接受某种接口以确保对象支持您要执行的操作。