Возможно ли иметь переменную с определенным типом ссылки на класс в AS3? - PullRequest
0 голосов
/ 14 февраля 2011

Исходя из опыта Delphi, я привык иметь ссылки на классы / указатели определенного суперкласса, например:

#!pas
var
  niceVar: class of TClassOne; // Delphi style
  badVar: class; // Only? allowed AS3 style to the best of my knowledge

begin
  niceVar := x;
  badVar := x;

  niceVar.staticMethodSpecificToTClassOne;
  TClassOne(badVar).staticMethodSpecificToTClassOne;
end;

Это означает, что мне не нужно разыгрыватьпеременные для определенного класса;они имеют правильный класс заранее.Это также означает, что проверка во время компиляции может быть выполнена, чтобы убедиться, что к нужным элементам обращаются, и мне не нужно проверять, что niceVar на самом деле является классом TClassOne, если niceVar был передан методу.

#!pas
procedure test(var x: class of TClassOne);
begin
  x.someStaticMethod(true);
end;

// An entry point
var
  niceVar: TClassTwo; // Does not inherit from TClassOne

begin
  test(niceVar); // Error - niceVar does belong to the TClassOne "family"
end;

Таким образом, точно так же, как переменная, хранящая объект, может относиться к определенному типу, и принимаются только объекты этого класса или его подклассов, так что «класс AClass» позволяет ограничивать переменные специфического класса ссылками наопределенный класс или унаследованные от него.

Надеюсь, это как-то имеет смысл;Я не знаю конкретной номенклатуры для всего «класса SuperClass».

Так что я хотел бы сделать то же самое в AS3, поскольку наличие переменных / свойств / параметров типа Class не режет горчицу;это похоже на то, что все переменные / свойства / параметры объекта просто являются объектами, а не их собственными, определенными типами.


Edit # 1 - 2011-02-14 13: 34 Подсветка синтаксиса здесь запутана;Я хочу, чтобы код был распознан как Object Pascal.С нетерпением ждем this .


Edit # 2 - 2011-02-14 15: 11 Вот пример того, чего я хотел бы достичь сэто в AS3.

Текущий код

public function set recordClass(aRecordClass: Class): void 
{
  if (!extendsClass(aRecordClass, TRecord)) 
  {
    throw new Error("TDBTable - Invalid record class passed.");
      return;
  }
  _recordInstance = new aRecordClass(this); // Compiler has no idea of the classes constructor signature, but allows this regardless.
}

Что бы я хотел сделать

public function set recordClass(aRecordClass: TRecordClass): void 
{
  _recordInstance = new aRecordClass(this); // Compiler will know that I am creating a TRecord
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2011

AFAIK, вы должны остаться с типом Class.Это одно из ограничений ActionScript, так же как Function является ссылкой для всех типов функций.AS 3.0 довольно часто вызывает проверки во время выполнения, когда в других языках были статические проверки - статическая проверка типов не самая сильная сторона.

0 голосов
/ 14 февраля 2011

Полагаю, вы могли бы использовать getDefinitionByName

...