| « Решение проблемы наследования от Point. | flex-coding-guidelines » |
Публичные переменные в классе flash.geom.Point
Дополнение к посту «Публичные переменные это зло… »
Постараюсь более подробно раскрыть проблему реализации системного класса flash.geom.Point.
Изучим структуру flash.geom.Point:
- var myTestPoint : Point = new Point(9,9);
- trace(describeType(myTestPoint));
в данные момент меня интересуют две строчки, которые говорят что свойства x, y класса flash.geom.Point, описаны как публичные переменные
…
variable name="x” type="Number”
…
variable name="y” type="Number”
…
какие проблемы это вызывает?
Отсутствует возможность переопределить данные свойства в классе потомке.
Пример 1:
- Point;
- public class MyPoint extends Point
- {
- public function set x (v:Number)
- {
- x = v;
- }
- }
- }
error: 1024: Overriding a function that is not marked for override.
Пример 2:
- package
- {
- import flash.geom.Point;
- public class MyPoint extends Point
- {
- public override function set x (v:Number)
- {
- x = v;
- }
- }
- }
error: 1023: Incompatible override.
Следовательно для реализации, например, интерфейса IPoint
- package
- {
- public class IPoint
- {
- function set x (v : Number) : void;
- function get x () : Number;
- function set y (v : Number) : void;
- function get y () : Number;
- }
- }
нельзя использовать использовать наследование
- public class MyPoint extends Point implements IPoint
придется использовать делегацию:
- package
- {
- import flash.geom.Point;
- public class MyPoint implements IPoint
- {
- private var _point : Point;
- public function MyPoint ()
- {
- _point = new Point();
- }
- public function set x (v:Number):void
- {
- _point.x = v;
- }
- public function get x ():Number
- {
- return _point.x;
- }
- public function set y (v:Number):void
- {
- _point.y = v;
- }
- public function get y ():Number
- {
- return _point.y;
- }
- …
- }
- }
Делегация в данном случае не оправдана, так как класс MyPoint нельзя будет использовать в методах работающих с Point. Вокруг стандартных методов придётся писать обёртки или использовать преобразование.
Пример преобразования:
…
- var Rect:Rectangle = new Rectangle(0,0, 100, 100);
- Rect.offsetPoint( new Point(myPoint.x, myPoint.y) );
…
Пример обертки:
- package
- {
- import flash.geom.Rectangle;
- import flash.geom.Point;
- public class MyRectangle extends Rectangle
- {
- public function offsetIPoint ( point : IPoint)
- {
- offsetPoint (new Point ( point.x, point.y ));
- }
- }
- }
4 комментариев
Преимущество обертки в том, она работает с объектами, реализующими интерфейс IPoint, не обязательно экземпляром MyPoint.