优化我的OOP结构,并尝试尽可能直观地显示代码, 使用基本的OOP原则这肯定有帮助,但我的工艺只走了这么远。我希望改进我的做法:
package
{
import flash.display.*;
import flash.text.*;
public class Button extends Sprite
{
protected var _spr:Sprite = new Sprite();
protected var _tf :TextField = new TextField();
protected var c :Number;
protected var xx :Number;
protected var yy :Number;
protected var w :Number;
protected var h :Number;
protected var t :String;
protected var a :Number;
protected var l :Number;
protected var lC :Number;
function Button
(
_col:Number, //beginFill
_x:Number, _y:Number, _w:Number, _h:Number, //drawRect
_t:String = "", //TextField (optional)
_a:Number = 1, //beginFill (optional)
_l:Number = 0, _lC:Number = 0xFFFFFF //lineStyle (optional)
)
{
c = _col;
xx = _x;
yy = _y;
w = _w;
h = _h;
t = _t;
a = _a;
l = _l;
lC = _lC;
_spr.addChild(_tf);
draw();
}
public function draw ():void
{
_spr.graphics.clear ();
_spr.graphics.lineStyle(l, lC);
_spr.graphics.beginFill(c);
_spr.graphics.drawRect (xx, yy, w, h);
var f:TextFormat = new TextFormat;
f.font = "Arial";
_tf.text = t;
_tf.autoSize = TextFieldAutoSize.LEFT;
_tf.x = xx + w/2 - _tf.textWidth / 2;
_tf.y = yy + h/2 - _tf.textHeight / 1.5;
_tf.width = w - 2;
_tf.height = h - 2;
_tf.alpha = 0.75;
_tf.setTextFormat(f);
_tf.selectable = false;
_tf.mouseEnabled = false;
_spr.graphics.endFill ();
}
/* ----------------------- *
* GETTERS *
* ----------------------- */
//OVERRIDE
override public function get x () :Number {return (xx)}
override public function get y () :Number {return (yy)}
override public function get width () :Number {return (w)}
override public function get height () :Number {return (h)}
//SUPPLEMENTARY
public function get col () :Number {return (c)}
public function get text () :String {return (t)}
public function get line () :Number {return (l)}
public function get lineC () :Number {return (lC)}
public function get getObj () :Sprite {return (_spr)}
/* ----------------------- *
* SETTERS *
* ----------------------- */
//OVERRIDE
override public function set x (_n:Number) :void
{ xx = getObj.x = Math.round(_n - xx) }
override public function set y (_n:Number) :void
{ yy = getObj.y = Math.round(_n - yy) }
override public function set width (_n:Number) :void
{ w = Math.round(_n) }
override public function set height (_n:Number) :void
{ h = Math.round(_n) }
//SUPPLEMENTARY
public function set col (_n:Number) :void
{
c = _n;
draw();
}
public function set text (_s:String) :void
{
t = _s;
draw();
}
public function set line (_n:Number) :void
{
l = _n;
draw();
}
public function set lineC(_n:Number) :void
{
lC = _n;
draw();
}
}
}
从上面的Button类中,您可以对我的结构和解释做出什么解释。组织?我已阅读并阅读了许多关于你应如何在逻辑上执行OOP的文章,我认为我已经准备好进行一些调整或批评,而不是我对AS3中一个类应该如何处理的理解(我知道的是间接的。)
一些具体问题:
当我从我的Main类实例化'Button'时,我应该将它添加到舞台那里或 使用Super?
“1047”错误是否会被修复?除了已经提到的那些之外,什么是可持续(或更有效)的解决方案?:http://curtismorley.com/2008/10/15/actionscript-error-1047-parameter-initializer-unknown-or-is-not-a-compile-time-constant/
为了更新宽度/高度变化,我必须在修改宽度和宽度的覆盖功能之外调用我的绘图功能。高度特别。有没有通过覆盖函数调用draw()的正确方法?没有提供错误输出,似乎这样做是违反规则的,所以我只是从Main调用draw()作为黑客修复..可能在按钮中写一个函数,系住更改属性的事件?
< / LI> 醇>如果有人打扰解析这一文字墙,感谢阅读,我感谢您的任何批评,苛刻或其他:)
答案 0 :(得分:0)
首先,您的变量名称不具描述性。如果您要将变量命名为“c”,“t”,“lc”等,至少可以使用内联注释来描述它们的用途。即使您评论填充它们的参数较低,也会对您所做的事情产生不必要的开销。
如果你因为IDE中历史上糟糕的代码完成而这样做了,请使用Flash Builder或其中一个优秀的代码编辑工具来帮助你输入lineColor,textField等。
仔细观察,看起来你已经至少部分地完成了这项工作,因为你已经颠倒了正常的约定,那就是函数的参数而不是使用下划线,而私有/受保护的存储应该使用下划线,否则应该与公共属性具有相同的名称。更改您的约定以匹配AS3世界的其余部分将大大有助于使您的代码更具可读性。
如果您不想丢失函数参数中的下划线,可以使用FB中的片段将实例变量设置为同名参数。
在ActionScript中很好地理解了失效,所以我不确定为什么会出现问题。它看起来像这样:
protected function invalidate():void {
_isInvalid = true;
addEventListener(Event.ENTER_FRAME, validate);
}
protected function validate(e:Event):void {
removeEventListener(Event.ENTER_FRAME, validate);
if (_isInvalid) {
draw();
}
_isInvalid = false;
}
在您正在调用draw()的任何地方调用它,这将减少您更新显示列表的次数。
MPO是你不应该有View Classes的构造函数参数,因为这使得它无法在时间轴中使用它们。
你可能会发现,如果你愿意使用时间轴,那么很多艰苦的工作就会消失 - 你只需通过AS类添加行为并在IDE中绘制图形(使用9之类的东西) - 缩放比例,过滤器等,以最大限度地减少维护麻烦)。如果你想要一个看起来不同的按钮,你绘制一个不同的按钮,附加你的行为类,并完成。
很多人都没有意识到maintain good OOP可能允许时间表接管大部分繁重的工作。希望这可以为您提供您想要的内容,或者至少为您提供一些您可以继续使用的搜索字词。请注意,如果您有兴趣了解有关利用时间表的更多信息,请回发。当帖子存档时,该源代码的链接就被吃掉了。