PDA

Просмотр полной версии : default параметры в конструкторе


kup
14.06.2009, 20:54
Хочется странного... чтобы при создании, по new MySuperSprite(), спрайт получал некие, заранее извесные координаты. А по new MySuperSprite(new Point(x, y)) соответсвенно позиционировался куда скажут.

package
{
import flash.geom.Point;
import flash.display.Sprite;

class MySuperSprite extends Sprite
{
function MySuperSprite(position:Point = new Point())
{
super();

this.x = position.x;
this.y = position.y;
}
}
}

Можно конечно все по другому сделать. Но искал в хелпе - не нашел явного запрета.

BlooDHounD
14.06.2009, 21:17
package {
import flash.geom.Point;
import flash.display.Sprite;

class MySuperSprite extends Sprite {

public function MySuperSprite(position:Point=null) {
super();
if ( !position ) position = new Point();
this.x = position.x;
this.y = position.y;
}
}
}

Яски
14.06.2009, 21:21
Новой возможностью ActionScript 3.0 является способность объявлять для функции значения параметров по умолчанию. Если вызывается функция со значениями параметров по умолчанию, используются значения, указанные для параметров в определении функции. Все параметры со значениями по умолчанию должны быть помещены в конец списка параметров. Значения, которые присвоены в качестве значений по умолчанию должны быть константами, определяемыми во время компиляции. Существование для параметра значения по умолчанию фактически делает этот параметр необязательным параметром. Параметр без значения по умолчанию считается обязательным параметром.
http://help.adobe.com/ru_RU/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f56.html

Но можно написать так:

function Constructor(point:Point = null) {
this.x = (point == null) ? 0 : point.x;
this.y = (point == null) ? 0 : point.y;
}

kup
14.06.2009, 21:46
Спасибо, но все же очень спорный запрет. Например,

public static const pnt:Point = new Point(10, 20);

вполне может быть константой. Обидно что,

function Constructor(pointX:Number = 0, pointY:Number = 0)

работает и как бы подталкивает плодить сущности...

dimarik
15.06.2009, 01:36
function Constructor( position:Point = new Point(10, 20) ) {
// whatever else;
}

BlooDHounD
15.06.2009, 12:11
dimarik, и этот код работает? :)

CrazyFlasher
15.06.2009, 12:12
сомневаюсь :)

dimarik
15.06.2009, 12:34
Не, не работает. Point на этапе компиляции не может быть определен. Только простые типы данных могут быть определены на этом этапе. Только их и можно использовать в качестве подобных аргументов.

kup
16.06.2009, 04:06
Вот и я с разбегу на эти грабли наступил. :) В других языках, есть костыль в виде forward declaration. Пишем class Point; и компилятор считает, что все путем.