数据类型数组

Array of data types

出于某些原因我需要这样的东西:

DT: array[0..3] of types = (string, integer, double, boolean);

这可能吗?

即使可以编译,生成的 DT[] 数组也无法用于任何利润。

你只能使用

var v: DT[0]; // this will be a string variable

但这显然毫无意义,因为您特别有能力定义自定义类型:

type
  TMyString = type string; 
...
 var
   v: TMyString;

因此,将 TMyString 替换为 DT[0],您就会得到预期的结果。

如果您希望使用 DT[] 例如有一个循环,例如使用 DT[i],我看不到任何可能使用此语法的方法。

另一方面,我通常做的是:

  • 使用 variant 变量来存储任何类型的值 - 我想这就是你想要重新发明的东西;
  • 使用枚举 meta-classes 即时启动给定的 class。

首先,variant 值非常强大:

var v: variant;
begin
  v := 1; // now v holds an integer
  ShowMessage(v); // will be converted to string before display
  if VarIsStr(v) then // false
    ShowMessage('string')
  else if VarIsNumeric(v) then // true
    ShowMessage('number');
  v := 'toto'; // now v holds a string
  ShowMessage(v);
  if VarIsStr(v) then // true
    ShowMessage('string')
  else if VarIsNumeric(v) then // false
    ShowMessage('number');
  v := true;   // now v holds a boolean
  if VarIsStr(v) then // false
    ShowMessage('string')
  else if VarIsNumeric(v) then // false
    ShowMessage('number')
  else if VarIsBool(v) then // true
    ShowMessage('boolean');  
...

对于元classes:

type
  TMyClassParent = class
  ...
  end;

  TMyClass1 = class(TMyClassParent)
  ...
  end;
  TMyClass2 = class(TMyClassParent)
  ...
  end;
  TMyClass3 = class(TMyClass1)
  ...
  end;

  // define the meta-class type
  TMyClassParentClass = class of TMyClassParent;
  // define an enumeration
  TMyClasses = (myclass1, myclass2, myclass3);

const
  MYCLASS_NAME: array[TMyClasses] of string = (
     'one', 'two', 'three');
  MYCLASS_CLASS: array[TMyClasses] of TMyClassParentClass = (
    TMyClass1, TMyClass2, TMyClass3);

var
  c: TMyClassParent;
  cc: TMyClasses;
begin
  for cc := low(cc) to high(cc) do
  begin
    writeln('Using ', MYCLASS_CLASS[cc].ClassName, ' for class ', MYCLASS_NAME[cc]);
    c := MYCLASS_CLASS[cc].Create;
    try
      // use Liskov's friendly c instance
    finally
      c.Free;  
    end;
  end;
end.

如果你正确地遵循里氏替换原则,你可以抽象地使用 c: TMyClassParent,因为 children 不会影响 parent [=48] 的期望=]行为。

查看 Delphi 来源中的 system.pas 和 variants.pas。

DT: array[0..3] of TVarType = (varString, varInteger, varDouble, varBoolean);

您可以使用 VarType(value) 来获取变体类型。