Исходя из опыта 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
}