0

私はしばらくの間AS3プロジェクトに取り組んできましたが、壁にぶつかったと思います。私のプロジェクトでは、一連の要素をCircular ListCircular Listに配置する必要があるため、以前に C# で行った に自分自身をコピーしました。

問題は、 Genericsの使用に大きく依存していたことです。今、私はそれらを持っていません。

ここにコードがあります。変数のT型は、私が存在したいジェネリックを表します。

Node.as:

パッケージ
{
    パブリック クラス ノード
    {
        var nodeContent:T;
        var nextNode:ノード;

        関数 Node(nodeElement:T)
        {
            this.nodeContent = nodeElement;
        }
    }
}

CircularList.as:

package 
{
    public class CircularList
    {
        var head:Node;
        var tail:Node;
        var listLength:int;

        function CircularList()
        {
            this.head = null;
            this.tail = null;
            this.listLength = 0;
        }

        function Add(addition:T)
        {
            adding:Node = new Node(addition);

            if(this.head == null)
            {
                this.head = adding;
                this.tail = adding;
                head.nextNode = tail;
                tail.nextNode = head;
            }
            else
            {
                tail.nextNode = adding;
                tail = adding;
                tail.nextNode = head;
            }
            listLength++;
        }

        function Find(requested:T):Node
        {
            var finder:Node = null;
            var searching = head;
            var i:int;
            while(i <= listLength)
            {
                if(searching.nodeContent == requested)
                {
                    finder = searching;
                }
                searching = searchig.nextNode;
                i++;
            }
            return finder;
        }
    }
}

ジェネリックなしでこれを機能させる方法はありますか?

編集:これに関する本当の問題は、 Node クラスのNodeContentをオブジェクトにしたいということです。基本的には円形のテーブルに座っている人のリストを作成したいのですが、この問題のために特別に作成されたものではなく、再利用できるコードが必要です

4

1 に答える 1

0

コメントから、ここでの最良の選択肢はインターフェイスを使用することのようです。

型を使用する代わりに、すべてのクラス T に のようなインターフェイスを実装させますINode。このインターフェイスでは、型 T が必要とするすべての機能を定義し、実装する各クラスで必要に応じて実装できます。このようにして、関数シグネチャをorINodeの代わりに型を取るように変更し、これらの関数が作用できる共通のメソッドのセットを持つことができます。Class*

function Add(addition:INode){
  //add logic on INode
}



function Find(requested:INode):Node{
   //find logic on INode
}

編集:インターフェースに関するちょっとした情報、

http://active.tutsplus.com/tutorials/actionscript/as3-101-oop-introduction-to-interfaces/

2 つのクラス A、B があり、これらのクラスのそれぞれに同様のメソッド があり、異なる方法でdoTrace実装する必要があるとします。インターフェイスを定義し、これらのクラスの両方に実装して、その型を呼び出しようとしている任意のメソッドに渡すことができますdoTrace

ITraceable というインターフェイスから始めます。

public interface ITraceable{
   function doTrace():void //all methods defined in interfaces are seen as public
}

ここで、A と B の 2 つのクラス

public class A implements ITraceable { //implementing our interface, when we do this we need to define all methods in ITraceable

     public function doTrace():void{
          trace("I am A");
     }

}

Bについても同様のことを行う

 public class B implements ITraceable {

     public function doTrace():void{
         trace("I am B");
     }

 }

今、いくつかの外部クラスでこれを使用したい

 public function letsTrace():void{
      doTheTrace(new A()) //I am A
      doTheTrace(new B()) //I am B

 }

 public function doTheTrace(object:ITraceable):void { //now we can pass both A and B into this function
     object.doTrace(); //since ITraceable requires all objects that implement it have this method we can guarantee it will be here
 }

これがアプリケーションを通じて役立つことを願っています

于 2013-01-12T18:28:56.330 に答える