« Решение проблемы наследования от Point.flex-coding-guidelines »

Публичные переменные в классе flash.geom.Point

Дополнение к посту «Публичные переменные это зло… »
Постараюсь более подробно раскрыть проблему реализации системного класса flash.geom.Point.

Изучим структуру flash.geom.Point:

  1. var myTestPoint : Point = new Point(9,9);
  2. trace(describeType(myTestPoint));

в данные момент меня интересуют две строчки, которые говорят что свойства x, y класса flash.geom.Point, описаны как публичные переменные


variable name="x” type="Number”

variable name="y” type="Number”

какие проблемы это вызывает?

Отсутствует возможность переопределить данные свойства в классе потомке.

Пример 1:

  1. Point;
  2.  
  3.         public class MyPoint extends Point
  4.         {
  5.                
  6.                 public function set x (v:Number)
  7.                 {
  8.                         x = v;
  9.                 }
  10.         }
  11. }

error: 1024: Overriding a function that is not marked for override.

Пример 2:

  1. package
  2. {
  3.         import flash.geom.Point;
  4.  
  5.         public class MyPoint extends Point
  6.         {
  7.                
  8.                 public override function set x (v:Number)
  9.                 {
  10.                         x = v;
  11.                 }
  12.         }
  13. }

error: 1023: Incompatible override.

Следовательно для реализации, например, интерфейса IPoint

  1. package
  2. {
  3.         public class IPoint
  4.         {
  5.                
  6.                 function set x (v : Number) : void;
  7.                 function get x () : Number;
  8.                
  9.                 function set y (v : Number) : void;
  10.                 function get y () : Number;
  11.                
  12.         }
  13. }

нельзя использовать использовать наследование

  1. public class MyPoint extends Point implements IPoint

придется использовать делегацию:

  1. package
  2. {
  3.         import flash.geom.Point;
  4.  
  5.         public class MyPoint implements IPoint
  6.         {
  7.                
  8.                 private var _point : Point;
  9.                
  10.                 public function MyPoint ()
  11.                 {
  12.                         _point = new Point();
  13.                 }
  14.                
  15.                 public function set x (v:Number):void
  16.                 {
  17.                         _point.x = v;
  18.                 }
  19.                 public function get x ():Number
  20.                 {
  21.                         return _point.x;
  22.                 }
  23.                
  24.                
  25.                 public function set y (v:Number):void
  26.                 {
  27.                         _point.y = v;
  28.                 }
  29.                 public function get y ():Number
  30.                 {
  31.                         return _point.y;
  32.                 }
  33.                
  34.         }
  35. }

Делегация в данном случае не оправдана, так как класс MyPoint нельзя будет использовать в методах работающих с Point. Вокруг стандартных методов придётся писать обёртки или использовать преобразование.

Пример преобразования:

  1. var Rect:Rectangle = new Rectangle(0,0, 100, 100);
  2. Rect.offsetPoint( new Point(myPoint.x, myPoint.y) );

Пример обертки:

  1. package
  2. {
  3.         import flash.geom.Rectangle;
  4.         import flash.geom.Point;
  5.  
  6.         public class MyRectangle extends Rectangle
  7.         {
  8.                
  9.                 public function offsetIPoint ( point : IPoint)
  10.                 {
  11.                         offsetPoint (new Point ( point.x, point.y ));
  12.                 }
  13.                
  14.         }
  15. }

Bookmark this article at

Постоянная ссылка 2007-03-03 10:34:48, от agahov Email , 835 слов, Рубрики: Flex, AS3 , 4 комментариев »

4 комментариев

Комментарий от: Konstantin Kovalev [Учаснег] Email · http://riapriority.com/blogs/constantiner.php
Кстати, более красивым решением будет не писать обертку вокруг Rectangle, а все-таки добавить в MyPoint метод getUnderlayingPoint, который бы возвращал оригинальный Point для передачи в тот же Rectangle. Но тут, конечно, тоже надо осторожно ибо побочные эффекты вполне возможны. Зависит от задачи.
2007-03-03 @ 13:51
Да это более красивое решение, реализующее преобразование.

Преимущество обертки в том, она работает с объектами, реализующими интерфейс IPoint, не обязательно экземпляром MyPoint.
2007-03-04 @ 10:05
Комментарий от: iv [Посетитель] Email · http://www.bezier.ru
watch
2007-11-12 @ 14:52
Комментарий от: iv [Посетитель] Email · http://www.bezier.ru
ступил. снесли в AS3 watch.
2007-11-12 @ 15:08

Оставить комментарий


Ваш email адрес. (Не будет показан на сайте.)

Ваш URL будет показан.
:!: :?: :idea: :) :D :p B) ;) :> :roll: :oops: :| :-/ :( :'( |-| :>> :yes: ;D :P :)) 88| :. :no: XX( :lalala: :crazy: >:XX
(Заменить прерывания строк на <br />)
(Имя, email и сайт)
(Разрешить пользователям посылать вам сообщения (ваш email не отображается).)
3 + 2 + 7 - 1?
antispam test

Вы можете использовать OpenID чтобы предоставить ваше имя, email и url.