Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   интересная конструкция. (...) (http://www.flasher.ru/forum/showthread.php?t=88955)

BlooDHounD 04.12.2006 21:42

интересная конструкция. (...)
 
Код:

// класс
public class MyClass {
        public function MyClass(id:uint, type:String, ... params) {
                // тут что-то порисходит. не важно.
        }
}

//функция есть
public function getMyClass(id:uint, type:String, ... params):MyClass {
        // вот тут косяк.
        // как передать params в конструктор грамотно и без лишних
        // извращений.
        return new MyClass(id, type, ...);
}

Смысл в том что может всё-таки есть нормальный способ, а то apply юзать не хочется, а чувствую, что придётся.

Если бы был просто массив то я применил бы apply не задумываясь, но тут сперва придётся дабавлять в массив первых 2 элемента, что само по себе мне кажется не совсем нормальным решением.

ir73 04.12.2006 22:21

попробуй глянь mx.utils.Delegate из 8ого флеша, может натолкнет на что-то. Мне тоже кстати и нтересно как это можно реализовать.

etc 05.12.2006 00:41

А что мешает в params запихнуть первые два элемента в начале и заэплаить их?

BlooDHounD 05.12.2006 14:03

ir73, если бы я пёрся от не нужного, по-моему скромному мнению, класса Delegate, который появился, кстати, задолго до появления 8го флэша, я бы не постил вопрос в ветку по 3му АС :)

__etc, ничего не мешает:
Цитата:

Смысл в том что может всё-таки есть нормальный способ, а то apply юзать не хочется, а чувствую, что придётся.

Если бы был просто массив то я применил бы apply не задумываясь, но тут сперва придётся дабавлять в массив первых 2 элемента, что само по себе мне кажется не совсем нормальным решением.

etc 05.12.2006 14:04

А чем тебе это решение не нормально?

BlooDHounD 05.12.2006 14:14

ну не знаю. просто как-то не логично. делают возможность принимать остаток параметров, но не дают так же красиво и этэтично передать их в такую же функцию.

etc 05.12.2006 14:17

Я думаю, красиво тут не будет, apply — первое и, возможно, единственное решение.

BlooDHounD 05.12.2006 14:45

ну сделал чрезе apply. но если вдруг кто знает другое решение - буду признаетелен.

BlooDHounD 05.12.2006 15:09

хех :) сделать сделал, да вот только не работает. как к конструткору применить apply ??? %)

etc 05.12.2006 16:51

Мммм, конструктор не является функцией…
Щас поковыряюсь, но что-то затык.

Можно, конечно, поставить проверку на длину params и, если она равна единице, то брать внутренний массив.

BlooDHounD 05.12.2006 16:59

__etc, ну сам понимаешь, что это не дело :)

Dendroid 05.12.2006 17:13

Цитата:

Сообщение от __etc
Мммм, конструктор не является функцией…
Щас поковыряюсь, но что-то затык.

Можно, конечно, поставить проверку на длину params и, если она равна единице, то брать внутренний массив.

Возможно, это недоделка компилятора, потому что в AS2 apply к конструктору вполне применим.
А в Flash 9 Alpha не пашет даже их пример из хелпа (использование альтернативного описания класса через функцию):
Цитата:

Advanced users may choose to use the function keyword instead of the class keyword to define a Function object that can be used as a template for creating objects. Such a function is called a constructor function because you can use it in conjunction with the new operator to create objects. If you use the function keyword to create a constructor function, its prototype object is assigned a property named constructor that holds a reference to the constructor function. If you then use the constructor function to create an object, the object inherits the constructor property from the constructor function's prototype object. For example, the following code creates a new constructor function, f, and an object named myF:
Код:

  function f() {}
  trace(f.prototype.constructor);      // function Function() {}
  trace(f.prototype.constructor == f); // true
  var myF = new f();
  trace(myF.constructor == f);        // true


etc 05.12.2006 17:15

Dendroid, там две модели наследования — прототипная и ещё какая-то (по дефолту). Как включить прототипную — хз.

Конструтор в AS3 не является функцией. Я даже пробовал getDefinitionByName, без результатно, правда.

Dendroid 05.12.2006 17:31

С другой стороны, constructor является writeable, и его можно переопределить ещё до создания экземпляра класса. :) Можно что-нибудь по этому поводу подумать... Не знаю, поможет или нет, не пробовал ещё...

etc 06.12.2006 01:39

У меня возникла некоторая мысль, что можно в конструкторе вызывать что-то типа
Код:

var args:Array = [arg1,arg2];
args = args.concat(params);
this.init.apply(this,args);

а в методе… А в методе хз, что, что-то типа:
Код:

var returnClass:AnyClass = new AnyClass();
var args:Array = [arg1,arg2];
args = args.concat(params);
returnClass.init.apply(returnClass,args);
return returnClass;

Типа того :)

barby 06.12.2006 03:37

Люди, а объясните практическую сторону этой проблемы: для чего это и когда надо? :away:

etc 06.12.2006 03:54

Прочитай первый пост :)

BlooDHounD 06.12.2006 15:47

__etc, ну тогда проще заюзать один unshift :) только вот с методом у меня проблем нету :) мне конструктор интересен.

пытался делать MyClass.prototype.constructor.call но у конструктора нефига нет никаких методов.

WindWalker 21.12.2006 14:07

Чисто на шару говорю первую пришедшую в голову мысль.
Никакой ответственности за ней не несу :)

А если вместо apply поставить call ?

etc 21.12.2006 15:45

WindWalker, call написан выше :)


Часовой пояс GMT +4, время: 22:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.