Просмотр полной версии : default параметры в конструкторе
Хочется странного... чтобы при создании, по 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;
}
}
}
Новой возможностью 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;
}
Спасибо, но все же очень спорный запрет. Например,
public static const pnt:Point = new Point(10, 20);
вполне может быть константой. Обидно что,
function Constructor(pointX:Number = 0, pointY:Number = 0)
работает и как бы подталкивает плодить сущности...
function Constructor( position:Point = new Point(10, 20) ) {
// whatever else;
}
BlooDHounD
15.06.2009, 12:11
dimarik, и этот код работает? :)
CrazyFlasher
15.06.2009, 12:12
сомневаюсь :)
Не, не работает. Point на этапе компиляции не может быть определен. Только простые типы данных могут быть определены на этом этапе. Только их и можно использовать в качестве подобных аргументов.
Вот и я с разбегу на эти грабли наступил. :) В других языках, есть костыль в виде forward declaration. Пишем class Point; и компилятор считает, что все путем.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.