数据类型数组

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

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

这有可能吗?

hangcoo 回答:数据类型数组

即使可以编译,生成的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变量存储任何类型的值-我想这就是您要重新发明的内容;
  • 使用枚举元类即时启动给定的类。

首先,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');  
...

对于元类:

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.

如果您正确遵循Liskov的替换原则,则可以以抽象方式使用c: TMyClassParent,因为子代不会影响对父类行为的期望。

,

在Delphi源代码中查找system.pas和variants.pas。

concert

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

本文链接:https://www.f2er.com/2982475.html

大家都在问