AS3:一个带参数的类,或两个类似的类

时间:2013-03-26 01:21:48

标签: actionscript-3 user-interface

如果要创建两个类似的自定义AS3可视组件,例如按钮,具有不同的外观,但功能相同,从代码执行,速度,性能方面来看哪种方法更好,更有效?

  1. 创建两个几乎相同的类,唯一的区别是 在可视组件中,所以我必须两次编写按钮控制功能?
  2. 使用参数输入创建一个类 我定义了哪种按钮
  3. 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
                    }
                }
            }
    }
    

4 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:2)

关于这两种结构的学术论证(不是这个特定的例子),我不得不说第一种选择是“更好”。虽然大多数SO社区普遍认为基于意见的职位一文不值,但我有几点需要提出并希望听到反驳论点。

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

所有人都说,我可能会选择包含按钮功能的基类,然后制作一些在视觉上做不同事情的子类。

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

答案 2 :(得分:1)

我认为所有这些答案都错过了Flash的观点。

首先,我不认为View类应该永远在Flash中有构造函数参数,因为你不可能在时间轴/舞台上使用它们。 Flash播放器不能(也不应该)提供这些构造函数参数。舞台和时间线是Flash的最大优势,所以如果你不使用它们,你至少浪费了25%的时间(你设置x,y,宽度,高度,以编程方式绘制图形的时间)那不必要的废话)。为什么要将自己锁定在一个主动阻止您使用所有工具的设计中?

我这样做是因为我有一个类来定义按钮的行为。然后通过为大按钮设置库符号来区分按钮,一个用于小按钮,一个用于形状像猪的按钮,一个用于看起来像太空船的按钮,无论如何。这些符号中的任何一个都将具有单个Button类作为基类(或者更可能的是,只是在库中定义为Button,因此它们将SimpleButton加载)。然后我只是在舞台上放置一个库符号实例,并将任何父类中的变量键入我的Button Class或SimpleButton。

这样做的好处是父类不需要知道具体的实现类型,只需要知道更通用的类型。这意味着库符号可以取消选中“在框架N中导出Actionscript”,并且可以在它们被使用的地方编译它们。这意味着初始加载时间可以减少到您可能不需要预加载器的程度,具体取决于您正在进行的其他操作。

有关此方法的更多信息,请参阅Combining the Timeline with OOP in AS3

答案 3 :(得分:0)

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

如果你正在处理spark按钮,那么你只需为每个实例指定一个不同的皮肤(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);
            }
        }
    }
}

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