Как сделать так, чтобы конструктор класса мог вызываться как функция? - PullRequest
2 голосов
/ 01 декабря 2010

Некоторые из классов верхнего уровня можно создавать, а также вызывать как функции (например, new Number() and Number(), new Boolean() and Boolean(), new Array() and Array()).

Обычно это используется для преобразования типов или в качествеярлык для реализации.Я хотел бы иметь возможность сделать то же самое:

public class Foo
{
  public function Foo():void
  {
    //do something
  }
}

public function Foo():Foo
{
  //do some stuff;
  return new Foo();
}

Возможно ли это?Если да, то как?

РЕДАКТИРОВАТЬ, чтобы уточнить:

Первоначально я хотел создать класс журналирования для взаимодействия с Flash / JavaScript и быть совместимым с различными браузерами.Я хотел использовать функцию log в качестве псевдонима метода в журнале class .Это заставило меня задуматься, могу ли я реализовать пользовательскую функцию приведения только потому, что.Теперь я понял, что это невозможно, но в любом случае было интересно поиграть.

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Вы можете определить классы:

package [package name]
{
  public class Foo
  {
    public function Foo():void
    {
      //do stuff
    }
  }
}

И вы можете определить функции:

package [package name]
{
  public function Foo():Bar
  {
    return new Bar();
  }
}

Но классы и функции не могут иметь конфликт имен. В противном случае вы получите ошибку сценария.

Пользовательская функция приведения не может быть определена с тем же именем, что и класс, но она может быть реализована под другим именем:

package [package name]
{
  public function CastFoo(foo:*):Foo
  {
    //do stuff
    return Foo(foo);
  }
}
0 голосов
/ 02 декабря 2010

это правильно:

public class Foo
{
  public function Foo():void
  {
    //do something
  }
}

это не так:

public function Foo():Foo
{
  //do some stuff;
  return new Foo();
}

если вы предшествовали Foo с "новым":

new Foo();

вы создаете новый экземпляр класса Foo.

если нет:

Foo();

вы ничего не получите - на самом деле вы получите ошибку компилятора об отсутствующих аргументах.

если вы передадите ему один аргумент:

var foo:Foo = Foo(bar);

вы будете разыгрывать "bar" как экземпляр Foo. Объект для кастования должен иметь суперкласс для кастования. как правило, он используется для преобразования более общего типа объекта в более конкретный тип объекта - например, приведение события event.target в виде Sprite или DisplayObject, возвращаемого getChild, в MovieClip.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...