【问题标题】:CircularList in ActionScript 3ActionScript 3 中的 CircularList
【发布时间】:2012-12-26 15:17:34
【问题描述】:

我从事 AS3 项目已经有一段时间了,我认为我遇到了困难。我的项目需要将一系列元素排列在一个循环列表中,所以我将自己复制到一个Circular List 中,我之前在 C# 中做过。

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

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

Node.as:

包裹 { 公共类节点 { 变量节点内容:T; 变量下一个节点:节点; 功能节点(节点元素: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 是一个对象。基本上,我想列出坐在圆桌上的人,但我想要一个可以重复使用的代码,而不是专门为这个问题制作的代码

【问题讨论】:

  • 根据我对泛型的快速阅读,ActionScript 中没有与 c# 泛型等效的东西。但是,如果将 T 替换为 *,则应该没问题(至少就提供的代码而言)。 * 是“任何类类型”的简写
  • 您是否希望将类类型传递给 Node 或实例化对象?
  • 我希望 NodeContent 成为一个对象。这就是问题所在......我认为否则它可以与 *(这是我在询问之前尝试过的,但是是的,需要在那里获得一个对象)
  • 你也试过用 * 替换 Node 吗?例如:var head:*;
  • 其他选项是使用接口。为可以是节点的类定义一个是否实用?

标签: actionscript-3 list generics nodes circular-list


【解决方案1】:

从 cmets 看来,您最好的选择是使用接口。

不是使用类型,而是让所有类 T 实现类似INode 的接口。在此接口中,您可以定义类型 T 所需的所有功能,并根据需要在每个实现类中实现它。通过这种方式,您可以将函数签名更改为采用 INode 类型,而不是 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/

假设我们有两个类,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
 }

希望这可以帮助您完成您的申请

【讨论】:

  • 我对接口的使用不太熟悉,真的,但我会做一个快速调查,尝试实现它,我们会看看它是如何进行的。谢谢!
  • @Anthony 我扩展了我的答案以包含一些关于接口的信息,希望这会有所帮助
  • 谢谢!实现后我会告诉你,但至少我肯定会从这些例子中学到很多东西。
  • 虽然您的意见对理解界面很有帮助,但我认为它对我不起作用,并为我正在处理的课程创建了一个循环列表。虽然我最初想创建一个通用的 CircularList 类,但没有泛型似乎是不可能的。不过谢谢!
猜你喜欢
  • 2012-03-11
  • 2015-12-22
  • 2017-09-03
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多