如果要创建两个类似的自定义AS3可视组件,例如按钮,具有不同的外观,但功能相同,从代码执行,速度,性能方面来看哪种方法更好,更有效?
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
}
}
}
}
答案 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);
}
}
}
}
然后,您必须创建不同的皮肤类,您将在其中定义按钮的可视逻辑。