数据类型数组
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) 来获取变体类型。
出于某些原因我需要这样的东西:
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) 来获取变体类型。