2013-03-26 65 views
1

在创建了两个类似的自定义AS3可视化组件,离的情况下按钮的外观不同,但功能相同,哪种方法更好,从代码执行,速度,性能方面来看效率更高?AS3:一类具有参数,或两个类似的类

  1. 创建两个几乎相同的类,其中,唯一的区别是在可视组件 ,所以我必须两次写按钮控制功能?
  2. 创建一类,具有参数输入 限定,我想哪种按钮具有

1:

package { 
      public class bigButton { 
       public function bigButton() { 
        //make a bigButton 
       } 
      } 
} 

package { 
       public class smallButton { 


        public function smallButton() { 
         //make a smallButton 
        } 
       } 
} 

2:

package { 
     public class OneKindOfButton { 
      public function OneKindOfButton(thisIsBigButton:Boolean) { 
       if (thisIsBigButton == true) { 
        //make it big 
       } else { 
        //make it small 
       } 
      } 
     } 
} 

回答

2

在大约两个结构(不是这个特殊的例子)的学术上的争论来看,我不得不认为,第一个选项是“更好”。虽然基于意见的帖子通常被大多数SO社区视为毫无价值,但我有几点要提出并希望听到反驳的论点。

做这件事,首先它让我觉得,可能应该有一个基类,它包含了所有的原始功能则一个子类,它调整的功能的一些部分的第二个选项。其次,它需要构造函数中的一个条件(可能在其他地方散布其他地方)来处理一个类正在处理的两个场景。我认为这个问题的一部分是,在AS3中,存在将所有功能和视图逻辑混合到一个类中的倾向,仅仅因为它可能并不是一个好主意。

所有的说法,我可能会走的路线有一个基类,其中包含按钮的功能,然后让一些子类,在视觉上做不同的事情。

同样在运行时间效率方面,我相信由于在第二种情况下运行时必须检查的额外条件,第一种情况会再次变得更好。在任何情况下,当性能和优化成为问题时,最好只运行一个测试(构建一个测试应用程序,每个测试应用程序可以运行10,000次,运行几次并获得平均值)。

+1

同意应该有一个基类,但由于差异是可视的,所以手写的Actionscript端根本没有理由解决按钮类型之间的差异。让Flash为库实例在后台生成子类。 – 2013-03-26 02:27:29

+1

我跟着艾米。我只是从我的角度思考(Flash Builder开发人员)没有考虑过Flash IDE和库。 – shaunhusain 2013-03-26 02:29:48

2

我只想创造一种按钮类的,因为你可以借鉴或添加其他显示对象进去。你甚至不需要一个布尔值来控制它。例如:

public class OneKindOfButton extends Sprite{ 


    public function OneKindOfButton(width:Number,height:Number) { 
     create(width,height); 
    } 


    private function create(width:Number,height:Number):void 
    { 
     graphics.clear(); 
     graphics.beginFill(0xff0000,1.0); 
     graphics.drawRect(0,0,width,height); 
     graphics.endFill(); 
    } 

} 

现在你可以使用这个类来创建任意大小的按钮。

var myButton:OneKindOfButton = new OneKindOfButton(200,20); 
myButton.x = 100; 
myButton.y = 300; 
addChild(myButton); 

如果您想使用图片而不是绘制到按钮中,只需将位图添加到按钮精灵中即可。

0

如果两个按钮之间的唯一区别是它们的外观,但所有的逻辑是共享的,那么你一定要只使用一个通用类。

如果你处理的火花按钮,那么你可以简单地指定为每个实例(about spark skins)的不同的皮肤。

package 
{ 
    import spark.component.Button; 

    public class MyCustomButton extends Button 
    { 
     static public const SMALL:String = "smallButton"; 
     static public const BIG:String = "bigButton"; 

     static private const DEFAULT_SIZE:String = SMALL; 

     public function MyCustomButton(type:String = DEFAULT_SIZE) 
     { 
      super(); 

      if (type == SMALL) 
      { 
       setStyle("skinClass", SmallButtonSkin); 
      } 
      else 
      { 
       setStyle("skinClass", BigButtonSkin); 
      } 
     } 
    } 
} 

然后,您必须创建到不同的皮肤类别,您将在其中定义按钮的可视化逻辑。

1

我认为所有这些答案都错过了Flash的观点。首先,我不认为视图类应该在在Flash中有构造函数参数,因为就在蝙蝠之后,你不可能在时间轴/舞台上使用它们。 Flash播放器不能(也不应该)提供这些构造函数参数。舞台和时间表是Flash的最大优势,所以如果你不使用它们,你至少浪费了25%的时间(在你设置x,y,宽度,高度,绘制图形的时间以及所有的时间那不必要的废话)。为什么要将自己锁定在一个积极阻止你使用所有工具的设计中?

我这样做的方式是我有一个这个类定义了按钮的行为。然后通过为大按钮设置一个库符号,一个用于小按钮,一个用于形状像猪的按钮,一个用于看起来像太空船的按钮等。这些符号中的任何一个都会将该单个按钮类作为基类(或者更可能只是将其定义为库中的Button,因此它们会隐藏SimpleButton)。然后,我只在舞台上放置了一个库符号的实例,并且将任何父类中的变量键入到我的Button类或SimpleButton中。

这样做的好处是父类不需要知道具体的实现类型,只是更一般的类型。这意味着库符号可以“未在N帧中为Actionscript导出”,并且可以将它们编译到使用它们的位置。这意味着初始加载时间可以减少到您可能不需要预加载器的程度,这取决于您正在进行的操作。请参阅Combining the Timeline with OOP in AS3

+1

不是每个人都使用Flash创作工具,使用FlashDevelop和as3创建游戏/应用程序是完全可能的,我也没有看到使用构造函数参数时遇到任何问题。它并不妨碍你使用舞台。 – 2013-03-26 14:35:07

+0

可以在FlashDevelop,Flash Builder或您有什么开始_start_,但是您可能想要移动到更全面的功能。仅仅因为_你没有看到任何问题并不意味着它们不存在。你究竟如何将构造函数参数加入你放置在舞台上的实例? – 2013-03-26 19:16:28

+1

我已经在Flash Develop中开发了完整的应用程序和游戏,我所说的是,如果您的工作流只是使用资源(可以是swfs或png)并纯粹在Flash开发/ Flash Builder中开发,则不必使用Flash Professional 。很显然,Flash Profiessional中的工作流程可能会有所不同,我不会使用它,所以我无法回答“您如何将构造函数参数导入您放置在舞台上的实例?'但是,如果您只是在Flash Develop/Flash Builder中完成您的应用程序/游戏,那么这不是问题。 – 2013-03-26 19:31:43

相关问题