Приведение объекта ActionScript к модели - PullRequest
2 голосов
/ 04 марта 2012

Существует ли какой-либо "автоматический способ" приведения "Объекта" к персонализированному типу данных модели в ActionScript 3?

Пример:

package Example{
   public class ExampleModel{
       private _id:int;
       private _randomAttribute:String;

       public function ExampleModel(){
           _id = 0;
           _randomAttribute = "";
       }

       public function get id():int{
           return _id;
       }

       public function set id(value:int):void{
           _id = value;
       }

       public function get randomAttribute():String{
           return _randomAttribute;
       }

       public function set randomAttribute(value:String):void{
           _randomAttribute = value;
       }
   }
}

Затем, в некоторой части моего кода, давайте предположим, что у меня есть что-то вроде этого:

var _obj:Object = new Object();
_obj.id = 1;
obj.randomAttribute = "Hello World";

То, что я хочу, было бы что-то вроде:

* * 1010

Но когда я это сделаю, результат на _exampleModel будет нулевым. Есть идеи? Спасибо.

РЕДАКТИРОВАТЬ:

Согласно ответу Маниша , все, что я изменил, это тип p var, который позволяет мне проходить все виды атрибутов:

public function fromObject(obj:Object):void{
    //p:* includes every type of attributes.
    for (var p:* in obj)
        if (this.hasOwnProperty(p))
            // Set private var directly.
            this["_" + p] = obj[p];
}

Спасибо Маниш и rcdmk . Ответа Маниша мне было достаточно, и согласно комментарию rcdmk , p: String не относится к типу данных, через которые будет проходить цикл, это фактически имя свойства, которое делает смысл, потому что каждое имя является строкой .

1 Ответ

3 голосов
/ 05 марта 2012

Единственный способ автоматически «разыграть» это следующее:

var model:Model = new Model();
var obj:Object = { id: "98123", name: "John Doe" };

for (var p:String in obj) {
    if (model.hasOwnProperty(p))
        model[p] = obj[p];
}

(Примечание: Model.id и Model.name имеют тип String в моем примере.)

Конечно, более правильный способ сделать это - передать простой объект объекту Model и позволить объекту Model поглотить его.

var model:Model = new Model(obj);

Или:

var model:Model = new Model();
model.fromObject(obj);

Где в коде Model есть:

public function Model(obj:Object = null)
{
    if (obj != null)
        fromObject(obj);
}

public function fromObject(obj:Object):void
{
    for (var p:String in obj)
        if (this.hasOwnProperty(p))
            // Set private var directly.
            this["_" + p] = obj[p];
}

Этот код может находиться в вашем абстрактном базовом Model классе, и все ваши конкретные Model подклассы (например, ProductModel, CustomerModel и т. Д.) Могут использовать его автоматически.

, например

public class ProductModel extends Model
{
    public function ProductModel(obj:Object = null)
    {
        super(obj);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...