8

非常に特定の目的のために、Array のバリエーションを作成しようとしています。私が次のものを持っているとき:

public class TileArray extends Array {
   // Intentionally empty - I get the error regardless
}

なぜ私はこれを行うことができないのですか?

var tl:TileArray = [1,2,3];

私はこれができるという事実にもかかわらず

var ar:Array = [1,2,3];

私が受け取るエラーはこれです:

Implicit coercion of a value with static type Array to a possibly unrelated type

4

3 に答える 3

13

Array を拡張する代わりに、Array のすべてのメソッドを公開する独自のクラスを作成できます。Proxy クラスを使用することで、すべてのデフォルトの Array メソッドを内部配列にリダイレクトできますが、独自のメソッドを追加する柔軟性もあります。

package
{
    import flash.utils.flash_proxy;
    import flash.utils.Proxy;

    use namespace flash_proxy;

    dynamic public class ExampleArray extends Proxy
    {
        private var _array:Array;

        public function ExampleArray(...parameters)
        {
            _array = parameters;
        }

        override flash_proxy function callProperty( name:*, ...rest):* 
        {
            return _array[name].apply(_array, rest);

        }

        override flash_proxy function getProperty(name:*):* 
        {
            return _array[name];
        }

        override flash_proxy function setProperty(name:*, value:*):void 
        {
            _array[name] = value;
        }

        public function getSmallestElement():*
        {
            var helper:Array = _array.concat().sort();
            return helper[0];
        }

    }
}

例:

var test:ExampleArray = new ExampleArray(8,7,6,5,4,3,2,1);
trace( test.getSmallestElement()); // 1
test.sort();
trace(test); // 1,2,3,4,5,6,7,8 
于 2010-06-22T10:50:20.997 に答える
3

[] は配列のみを作成します。Array のサブクラスの作成には使用できません。

新しい機能で配列を「拡張」する良い方法は、通常の配列を操作するスタンドアロンのユーティリティ関数を作成することです。何よりも、これにより、サブクラスを使用して作成された配列だけに限定されることなく、任意の配列に対して何でも実行できるようになります。

配列のユーティリティ関数を含むクラスの簡単な例を次に示します。

package com.example.utils
{
    public class ArrayUtil
    {
        public static function traceArray( array:Array ):void
        {
            trace( array.length, "[" + array + "]" );
        }
    }
}

使用法:

ArrayUtil.traceArray( [1, 2, 3] ); //output: 3 [1,2,3]
于 2010-06-22T22:02:37.387 に答える
1

[1,2,3].の略記 (またはシンタックス シュガー) ですnew Array(1,2,3)。それを念頭に置いて、コードが失敗する理由がより明確になるようです。

extendsであるため、EveryTileArrayは ですが、逆は真ではありません。したがって、 aが期待される場所にan を渡すことはできません。そのため、コンパイラ エラーが発生します。ArrayTileArrayArrayArrayTileArrayArrayTileArray

Arrayオブジェクトの実際のタイプはであり、実際には とは無関係であるため、キャストはコンパイル時から実行時までエラーを延期するだけTileArrayです。

機能を拡張したいArray(そして構文糖衣を追加できるようにしたい) 場合Proxyは、既に提案されているように、拡張を検討することをお勧めします。パフォーマンスが低いことに注意してください。このクラスを頻繁に使用する予定がある場合、これは最良のアイデアではない可能性があります。

于 2010-06-23T03:49:06.510 に答える