0

我从事AS3项目已经有一段时间了,但我认为我已经碰壁了。我的项目需要将一系列元素排列在一个Circular List中,所以我将自己复制到Circular List我之前在 C# 中完成的一个中。

问题是,这严重依赖于Generics的使用。现在我没有这些。

这是代码。T变量类型代表我希望存在的泛型。

节点.as:

包裹
{
    公共类节点
    {
        变量节点内容:T;
        变量下一个节点:节点;

        功能节点(节点元素:T)
        {
            this.nodeContent = nodeElement;
        }
    }
}

循环列表.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 所需的所有功能,并根据需要在每个实现类中实现它。通过这种方式,您可以将函数签名更改为采用 typeINode而不是Classor*并拥有一组这些函数可以执行的通用方法。

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/

假设我们有两个类,A,B,每个类都有一个相似的方法,doTrace需要以不同的方式实现。我们可以定义一个接口,在这两个类中实现它,并将该类型传递给任何想要调用的方法doTrace

从名为 ITraceable 的接口开始,

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

现在我们的两个类,A 和 B

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 回答