为什么调用uid-getter / setter(ArrayCollection)?

时间:2010-03-12 09:16:35

标签: flex actionscript-3

如果编写以下代码并且不理解为什么跟踪返回“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!

1 个答案:

答案 0 :(得分:1)

为什么要这样?该实现使用==,实际上甚至是===

此外,永远不会调用访问器。

containsListCollectionView的一种方法,会导致以下情况:

  1. 致电ListCollectionView::getItemIndex
  2. sort == null && filterFunction == null,因此:
  3. IList::getItemIndex
  4. 对于ArrayCollection ListCollectionView::listArrayList实现getItemIndexArrayUtil.getItemIndex(item, source);,实际上使用了项目和源数组条目之间的严格比较。< / p>

    如果您希望调用评估为true,则需要提供自己的IList实现。对ArrayList进行子类化并覆盖getItemIndex将会有所帮助,但我不确定它是否会破坏其他功能。