0

嗨,我正在自学 oop 原则。我想知道这是否是 Cardellis 定义参数多态性的正确示例。请赐教。
该示例采用 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

2 回答 2

1

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

如果我在系统中引入一个新类型,这个函数将会中断,因为它没有对其进行特殊处理。

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

于 2010-05-23T19:32:50.240 回答
1

不就是不。

多态性意味着您不必检查某物是什么类型,只需使用它即可。

一个例子是(C#):

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

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

于 2010-05-23T19:35:41.120 回答