0

こんにちは、私はおっと原則を自分自身に教育しています。これが 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

any関数は明示的に引数の型を扱っているので、私はこのppを信じていません。pp のポイントは、関数がオブジェクトの型に関係なく機能することです。

システムに新しいタイプを導入すると、特別な処理がないため、この関数は壊れます。

編集: getmetadata がオブジェクトを処理するという利点により、関数はオブジェクトとそのサブタイプのいずれかを処理するため、更新された例はサブタイプポリモーフィズムであると思います (および置換原則により、それはサブタイプです)。

于 2010-05-23T19:32:50.240 に答える
1

いいえ、いいえ。

ポリモーフィズムとは、何かがどのタイプであるかを確認する必要がなく、それを使用するだけであることを意味します。

例は次のとおりです (C#):

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

Method は、Object (C# ではほとんどすべて) から継承する任意の型の Object を受け入れることができ、Object は Equals を実装するため、それを使用してチェックを行うことができ、パラメーターの型をチェックする必要はありません。
通常、オブジェクトが実行したい操作をサポートしていることを確認するために、ある種のインターフェースを受け入れます。

于 2010-05-23T19:35:41.120 に答える