PDA

Просмотр полной версии : интересная конструкция. (...)


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

Можно, конечно, поставить проверку на длину 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 написан выше :)