Flex — создание новых примитивов

Для начала лучше сказать, что я новичок во Flex/OOP в целом. Я пытался добавить собственный класс на основе StrokedElement, чтобы реализовать простую сетку (не похожую на существующие Flex Grids - это было бы просто для отображения - не удерживая элементы и т.д...)

Мой текущий класс выглядит так:

package ui.helpers
{
    import flash.display.Graphics;

    import spark.primitives.supportClasses.StrokedElement;

    public class SGrid extends StrokedElement
    {
        public function SGrid()
        {
            super();
        }

        private var _gridSize:Number;
        [Inspectable(category="General", minValue="1.0")]

        public function get gridSize():Number 
        {
            return _gridSize;
        }

        public function set gridSize(value:Number):void
        {        
            if (value != _gridSize)
            {
                _gridSize = value;
                invalidateSize();
                invalidateDisplayList();
                invalidateParentSizeAndDisplayList();
            }
        }

        override protected function draw(g:Graphics):void {

            for(var x:int; x < width; x+= _gridSize) {
                g.moveTo(x,0);
                g.lineTo(x,height);
            }
            for(var y:int; y < height; y+= _gridSize) {
                g.moveTo(0,y);
                g.lineTo(width,y);
            }

        }

    }
} 

Который взят из Flex spark.primatives.rect - все работает нормально, но когда я добавлю его в свое приложение, я ожидаю сделать это:

<helpers:SGrid id="gridOne" width="100" height="200" gridSize="10">
        <s:stroke>
            <s:SolidColorStroke color="0xCCCCCC" alpha="0.8" />
        </s:stroke>
    </helpers:SGrid>

но на самом деле это работает вместо этого:

<helpers:SGrid id="gridOne" width="100" height="200" gridSize="10">
        <helpers:stroke>
            <s:SolidColorStroke color="0xCCCCCC" alpha="0.8" />
        </helpers:stroke>
    </helpers:SGrid>

Если я использую s:stroke, я получаю ошибки. Очевидно, я рад, что это работает, но я пытаюсь понять, в чем здесь разница?


person DrPumpkinhead    schedule 13.04.2011    source источник


Ответы (1)


Это связано с объявленным пространством имен класса.

SGrid является частью пространства имен helpers:, а не пространства имен s:.

Поэтому при настройке его свойств вам необходимо ссылаться на свойство через пространство имен helpers:.

Неважно, что само свойство было объявлено в базовом классе SGrid (в вашем случае StrokedElement), это свойство экземпляра SGrid.

Это то же самое, что:

var grid:SGrid = new SGrid();
grid.stroke = new SolidColourStroke(); 

Несмотря на то, что штрих объявлен в базовом классе, вы ссылаетесь на него через класс SGrid.

person Marty Pitt    schedule 13.04.2011
comment
Это имеет смысл! Большое спасибо за быстрый ответ. - person DrPumpkinhead; 14.04.2011