0

来自 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 传递给方法,我不必检查 niceVar 实际上是否属于 TClassOne 类。

#!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 类”是否允许特定类的变量仅限于对某个特定类的引用类或从它继承的那些。

我希望这是有道理的;我不知道整个“超类”事物的具体命名法。

所以我想在 AS3 中做同样的事情,因为拥有 Class 类型的变量/属性/参数不会减少芥末;这有点像让所有对象变量/属性/参数只是对象而不是它们正确的特定类型。


编辑 #1 - 2011-02-14 13:34 语法高亮在这里搞砸了;我希望代码被识别为 Object Pascal。期待这个


编辑 #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
}
4

2 回答 2

0

我想你可以使用getDefinitionByName

于 2011-02-14T12:16:32.133 回答
0

AFAIK,你必须坚持Class类型。这是 ActionScript 限制之一,与Function所有函数类型的参考相同。AS 3.0 经常强制运行时检查,而在其他语言中是静态检查 - 静态类型检查不是它的强项。

于 2011-02-14T13:36:54.947 回答