数据类型数组

问题描述 投票:-1回答:1

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

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

这甚至有可能吗?

arrays delphi delphi-7
1个回答
0
投票

即使可以编译,生成的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; // no 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'; // no v holds a string
  ShowMessage(v);
  if VarIsStr(v) then // true
    ShowMessage('string')
  else if VarIsNumeric(v) then // false
    ShowMessage('number');
  v := true;   // no 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,因为子级不会影响对父类行为的期望。

© www.soinside.com 2019 - 2024. All rights reserved.