【问题标题】:Is this an example for parametric polymorphism?这是参数多态性的一个例子吗?
【发布时间】:2011-02-22 23:47:02
【问题描述】:

嗨,我正在自学 oop 原则。我想知道这是否是 parametric polymorphism 的 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>

【问题讨论】:

  • 这个代码是在 Daily WTF 上找到的吗?

标签: oop polymorphism dynamic-languages


【解决方案1】:

不,只是不。

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

一个例子是(C#):

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,我重读了 Cardelli 的文章。我想我的例子很糟糕,因为我使用的是原始和抽象数据类型。我会重写它。
    • 问题不是原始数据类型。每当您开始编写检查传递的对象是否为 Foo/Bar/Whatever 类型的代码时,您都应该停下来尝试寻找另一种解决方案(在某些特殊情况下这是必要的,但这些情况非常非常罕见,即序列化和 ORM 需要在内部进行这些检查)。
    • 对不起,我的CF知识有限所以我不确定,但它看起来不像原版那么可怕,所以应该没问题。
    • 好的,在我的示例中,它们看起来好像都是相关的,但我没有在方法签名中指定这一点。为了实现子类型多态性,我必须像 getNumberOfParents(Parent arg) 那样指定祖先类。这样只会接受 Parent 及其子类型。通过指定组件,我在接受的数据类型上引入了一个边界 - 将其限制为对象。我无法将数组或字符串传递给此方法 - getNumberOfParents(component arg) 可以处理任何抽象数据类型(理论上您可以创建无限数量的类)。
    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多