1

如果创建两个相似的自定义 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
                }
            }
        }
}
4

4 回答 4

2

就关于这两种结构的学术争论(不是这个特定的例子)而言,我不得不争辩说第一个选择是“更好的”。尽管大多数 SO 社区通常认为基于意见的帖子毫无价值,但我有几点要提出并想听听反驳的论点。

对于这样做的第二种选择,首先它让我认为可能应该有一个包含所有原始功能的基类,然后是一个调整部分功能的子类。其次,它需要构造函数中的一个条件(并且可能在该类中的其他地方)来处理一个类正在处理的两种情况。我认为这里的部分问题是在 AS3 中倾向于将所有功能和视图逻辑混搭到一个类中,仅仅因为它是可能的,这并不是一个好主意。

总而言之,我可能会走一条包含按钮功能的基类的路线,然后制作一些在视觉上做不同事情的子类。

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

于 2013-03-26T01:57:12.580 回答
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);

如果您想使用图像而不是绘制到按钮中,您也可以通过将位图添加到按钮精灵中来做到这一点。

于 2013-03-26T01:41:16.860 回答
1

我认为所有这些答案都没有抓住 Flash 的重点。

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

我这样做的方式是我有一个定义按钮行为的类。然后通过一个库符号来区分按钮,大按钮一个,小按钮一个,一个猪形按钮,一个看起来像宇宙飞船的按钮,等等。这些符号中的任何一个都将单个 Button 类作为基类(或者更有可能只是在库中定义为 Button,因此它们是 SimpleButton 的子类)。然后,我只需将库符号的一个实例放在舞台上,并将任何父类中的变量输入到我的按钮类或 SimpleButton。

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

有关此方法的更多信息,请参阅在 AS3 中将时间线与 OOP 结合起来

于 2013-03-26T02:23:02.960 回答
0

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

如果您正在处理火花按钮,那么您可以简单地为每个实例指定不同的皮肤(关于火花皮肤)。

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);
            }
        }
    }
}

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

于 2013-03-26T01:53:19.313 回答