добавить метод в класс as3 - PullRequest
2 голосов
/ 02 апреля 2011

В as3 есть класс Point (flash.geom.Point) Я хочу добавить метод в класс Point (например, convertToStagePointMyMethod ()), и я бы хотел вызвать этот метод с помощью

var a:Point=new Point();
a.convertToStagePointMyMethod()

Что я должен сделать, чтобы добавить этот метод в класс Point? Возможно ли это без наследства. Я хотел бы использовать его как "частичные" классы в .NET

Ответы [ 4 ]

6 голосов
/ 02 апреля 2011

Вот краткий пример использования prototype :

Point.prototype.foo = function (arg:String):void{
    trace("foo called");//foo called
    trace("arg",arg);//this is a test
    trace("x",this.x);//7
    trace("y",this.y);//54
};

var p:Point = new Point(7,54);
p["foo"]("this is a test");

Это единственный способ сделать это без расширения класса.Также обратите внимание, что компилятор не будет компилироваться в строгом режиме, если вы попытаетесь использовать p.foo("test"), поэтому я написал p["foo"]("test") в моем примере.

2 голосов
/ 02 апреля 2011

Помимо использования действительно крутого примера OXMO456 (такого еще никогда не было, действительно круто), вам нужно использовать либо наследование, либо композицию.Если бы этот класс был «динамическим», как класс MovieClip или класс URLVariables, вам не о чем беспокоиться, но Point не является динамическим.

Вы можете создать свои собственные динамические классы, выполнив:

dynamic public class MyClass {...}

1 голос
/ 06 апреля 2011

Вместо того, чтобы расширять класс, я обычно создаю автономные служебные функции, например:

package com.example.utils
{
    public function doSomethingToPoint(p:Point):void
    {
        //do something
    }
}

Поместите его в файл с именем doSomethingToPoint.as, и все готово.Он работает так же, как встроенные функции уровня пакета, такие как flash.net.navigateToURL.Просто импортируйте и используйте функцию напрямую.

import com.example.utils.doSomethingToPoint;

var p:Point = new Point();
doSomethingToPoint(p)

В качестве альтернативы вы можете создать служебный класс с несколькими связанными статическими функциями, например:

package com.example.utils
{
    public class PointUtil
    {
        public static function doSomethingToPoint(p:Point):void
        {
            //do something
        }

        //other functions here
    }
}

Вы бы использовали класс иего функции таковы:

import com.example.utils.PointUtil;

PointUtil.doSomethingToPoint(p);

Лично я предпочитаю создавать автономные функции, чтобы моим проектам не нужно было компилировать дополнительные статические функции, которые фактически нигде не используются, но у каждого есть свои предпочтения.

1 голос
/ 03 апреля 2011

Создайте свой собственный класс

package 
{
    import flash.geom.Point;

    /**
     * ...
     * @author Jesse Nicholson
     */

    public class MyPoint extends Point 
    {
        public function MyPoint(positionX:Number, positionY:Number) {
            //Pass the constructor args to the super class, the Point class since it requires these params in it's constructor
            super(positionX, positionY);
        }

        public function convertToStagePointMyMethod():Number {
            //Do my calculations here
            var someNumber:Number = 10;
            return someNumer;

            //OR return a Point OR do whatever the hell you want here, you're the boss of your own point class
        }
    }

}

Это просто то, как вы делаете вещи. Если у вас есть существующий класс, который вы хотели бы использовать, но просто добавили, добавьте его в новый класс и сделайте именно это. Это базовая идея в объектно-ориентированном программировании и подходе «передовой опыт».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...