Уточнение моей структуры ООП и попытка сделать отображение кода как можно более интуитивным, используя базовые принципы ООП, это определенно помогает, но мое мастерство зашло так далеко. Я хочу улучшить свою практику:
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 какие интерпретации моей структуры и организации вы можете сделать? Я прочитал и следил за многими статьями о том, как вы должны логически выполнять ООП, и я думаю, что готов к некоторой настройке или критике, скорее, моего понимания того, каким должен быть класс в AS3 (я знаю, косвенно).
Некоторые конкретные вопросы:
Когда я создаю экземпляр «Кнопки» из своего основного класса, должен ли я добавить его на сцену там или внутри самого класса кнопок с помощью Super?
Будет ли когда-нибудь исправлена ошибка «1047»? Что такое устойчивый (или более эффективный) обходной путь, кроме уже упомянутых здесь?: http://curtismorley.com/2008/10/15/actionscript-error-1047-parameter-initializer-unknown-или-не-постоянное-времени-компиляции/
Чтобы обновить изменения ширины/высоты, я должен вызвать свою функцию рисования после модификации вне функции переопределения, в частности, для ширины и высоты. Есть ли правильный способ вызвать draw() через функции переопределения? Вывод ошибки не был предоставлен, но кажется, что это противоречит правилам, поэтому я просто вызываю draw() из Main в качестве исправления взлома. Возможно, написать функцию внутри кнопки, привязанную к событию измененного свойства?
Если кто-то удосужился разобрать эту стену текста, спасибо за чтение, и я ценю любую вашу критику, резкую или иную :)