如果编写以下代码并且不理解为什么跟踪返回“false”:
功能(带跟踪):
import mx.controls.Alert;
import mx.collections.ArrayCollection;
public function runTest():void {
var unique1:MyUniqueObject = new MyUniqueObject();
unique1.id = 1;
var unique2:MyUniqueObject = new MyUniqueObject();
unique2.id = 2;
var sameUniqueAsUnique1:MyUniqueObject = new MyUniqueObject();
sameUniqueAsUnique1.id = 1;
var collection:ArrayCollection = new ArrayCollection();
collection.addItem(unique1);
collection.addItem(unique2);
trace(collection.contains(sameUniqueAsUnique1));
}
MyUniqueObject级:
package
{
import mx.core.IUID;
[Bindable]
public class MyUniqueObject implements IUID
{
public var id:int;
public function get uid():String {
return "MyUniqueObject." + id;
}
public function set uid(uid:String):void {
//nothing to do here...
}
}
}
任何想法?
Cowabunga!
答案 0 :(得分:1)
为什么要这样?该实现使用==
,实际上甚至是===
。
此外,永远不会调用访问器。
contains
是ListCollectionView
的一种方法,会导致以下情况:
ListCollectionView::getItemIndex
sort == null && filterFunction == null
,因此:IList::getItemIndex
对于ArrayCollection
ListCollectionView::list
,ArrayList
实现getItemIndex
为ArrayUtil.getItemIndex(item, source);
,实际上使用了项目和源数组条目之间的严格比较。< / p>
如果您希望调用评估为true,则需要提供自己的IList
实现。对ArrayList
进行子类化并覆盖getItemIndex
将会有所帮助,但我不确定它是否会破坏其他功能。