Форум 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=185050)

Koopa 03.10.2012 17:57

Как задать массив по умолчанию в конструкторе класса?
 
Пока обхожусь таким образом:
Код AS3:

public function InfoWindow(st:Object,startPosition:Array=null,param:uint=100):void {
                        if (startPosition==null)

Есть решения как во входящих параметрах конструктора предопределить массив?

illuzor 03.10.2012 18:05

Код AS3:

... ,startPosition:Array = [1,2,890,42], ...


Aquahawk 03.10.2012 18:07

startPosition ||= чтовамнадо.

Буквально сегодня на работе рассматривали как работают параметры по умолчанию. Они не могут быть никакими типами кроме простых, намбер, инт, uint, string. А не могут быть т.к. эти значения сохраняются в структуре описателя метода отдельно от кода. Описано как это происходит в AVM 2 Overview в подразделе 4.5.1 раздела 4.5 который описывает структуру описывающую метод.

Цитата:

4.5.1 Optional parameters
The option_info entry is used to define the default values for the optional parameters of the method. The
number of optional parameters is given by option_count, which must not be zero nor greater than the
parameter_count field of the enclosing method_info structure.

option_info
{
u30 option_count
option_detail option[option_count]
}

option_detail
{
u30 val
u8 kind
}
Adobe ActionScript Virtual Machine 2 (AVM2) Overview 26

Each optional value consists of a kind field that denotes the type of value represented, and a val field that is an
index into one of the array entries of the constant pool. The correct array is selected based on the kind.
Constant Kind Value Entry
CONSTANT_Int 0x03 integer
CONSTANT_UInt 0x04 uinteger
CONSTANT_Double 0x06 double
CONSTANT_Utf8 0x01 string
CONSTANT_True 0x0B -
CONSTANT_False 0x0A -
CONSTANT_Null 0x0C -
CONSTANT_Undefined 0x00 -
CONSTANT_Namespace 0x08 namespace
CONSTANT_PackageNamespace 0x16 namespace
CONSTANT_PackageInternalNs 0x17 Namespace
CONSTANT_ProtectedNamespace 0x18 Namespace
CONSTANT_ExplicitNamespace 0x19 Namespace
CONSTANT_StaticProtectedNs 0x1A Namespace
CONSTANT_PrivateNs 0x05 namespace
Вот собственно типы которые там могут быть.

Добавлено через 2 минуты
illuzor
пробуйте перед тем как писать. Не получится так сделать. В силу устройства AVM это не возможно. Компилятор может это разрулить другим способом, но не делает этого.

Добавлено через 15 минут
А ну т.к. конструктор есть обычный метод, то всё вышесказанное относится и к конструктору и к методу. В параметры по умолчанию нельзя засунуть массив.

in4core 03.10.2012 19:03

Не знаю будет ли работать , нету перед рукой компила

Код AS3:

private const ARRAY:Array = [1,2,3,4,5,6];
 
public function f(a:Array = ARRAY)


caseyryan 03.10.2012 19:12

Цитата:

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

КорДум 03.10.2012 19:17

Зачем это, если можно определить его в теле метода, если аргументом передался null?

Koopa 03.10.2012 19:25

Затем, что это не обязательные данные для класса. И если в класс поступает массив, то он будет отработан по нужному принципу.

Tails 03.10.2012 19:30

Вообщем я тож как-то пытался сделать перегрузку конструктора, так ничего у меня и не вышло. Так-что наверное единственный действенный способ, это передать Object, не самое красивое решение. Более элегантно - передать какой нить экземпляр класса с настройками.

Aquahawk 03.10.2012 19:37

При чём тут перегрузка конструктора. В конструкторе так же как и в обычном методе могут быть значения по умолчанию. Но на них есть ограничение, только простые типы, ровно как и на обычные методы.

КорДум 03.10.2012 19:39

Цитата:

Затем, что это не обязательные данные для класса.
Ну дык null по умолчанию сделайте. В теле метода забивайте массив.
Перегрузки конструкторов в as3 нет, посему выкручиваются null'ами. А я статические методы определяю, возвращающие экземпляр класса, в котором они и прописаны.

Tails 03.10.2012 19:41

Ах да ссори, с начало подумал, что автор хочет передавать разные типы данных.

Koopa 03.10.2012 19:43

Цитата:

Сообщение от КорДум (Сообщение 1098388)
Ну дык null по умолчанию сделайте. В теле метода забивайте массив.
Перегрузки конструкторов в as3 нет, посему выкручиваются null'ами. А я статические методы определяю, возвращающие экземпляр класса, в котором они и прописаны.

И появился Он, и стало всем ясно,но не читал Он предыдущие посты.

КорДум 03.10.2012 19:45

И где я ответил не по теме? Вы пытаетесь в параметрах конструктора предопределить массив. Этого сделать нельзя, значит меняем его на null, а определяем в методе. Все.

Koopa 03.10.2012 19:49

Цитата:

Сообщение от КорДум (Сообщение 1098392)
И где я ответил не по теме? Вы пытаетесь в параметрах конструктора предопределить массив. Этого сделать нельзя, значит меняем его на null, а определяем в методе. Все.

Просто, для интереса, прокомментируйте код,написанный мной в начале сабжа.

КорДум 03.10.2012 19:50

Ну да, код в первом посте-то я и не читал. Пардоньте.

incvizitor 04.10.2012 13:38

Вообще ответ дан в №3, но кажется не оч. явным для новичка.

Код AS3:

public function InfoWindow(st:Object,startPosition:Array=null,param:uint=100):void {
        startPosition ||= [0,1];
}

Лаконичнее варианта в AS3 нету.


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

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