给出以下代码:
type
Class1 = public class
end;
Class1Class = class of Class1;
Class2 = public class (Class1)
end;
Class3 = public class (Class1)
end;
Class4 = public class
public
method DoSomething(c: Class1Class): Integer;
end;
implementation
method Class4.DoSomething(c: Class1Class): Integer;
begin
if c = Class2 then
result := 0
else if c = Class3 then
result := 1
else
result := 2;
end;
如何实际编写DoSomething
,因为相等比较会抛出编译器错误:
Type mismatch, cannot find operator to evaluate "class of Class1" = "<type>"
使用is
编译,但实际上,无论是传递true
还是Class2
,第一个条件总是会计算为Class3
。
目标是以跨平台的方式编写它,而不使用特定于Oxygene支持的任何一个平台的代码。
答案 0 :(得分:0)
您必须为条件中使用的每个类创建类引用,并使用is
运算符。
type
Class1 = public class
end;
Class1Class = class of Class1;
Class2 = public class (Class1)
end;
Class3 = public class (Class1)
end;
Class4 = public class
public
method DoSomething(c: Class1Class): Integer;
end;
Class2Class = class of Class2;
Class3Class = class of Class3;
implementation
method Class4.DoSomething(c: Class1Class): Integer;
begin
if c is Class2Class then
result := 0
else if c is Class3Class then
result := 1
else
result := 2;
end;
答案 1 :(得分:0)
我不确定您为什么要专门测试类类型 - 如果您通过类引用虚拟化类的行为,则不应该这样做,但假设您有理由需要使用类的类标识参考...
您没有说明您正在使用哪个平台,但在Java上,Java类类型可以很好地用于这些目的,而无需使用Oxygene类引用:
method Class4.DoSomething(c: &Class<Object>): Integer;
begin
case c of
typeOf(Class2): result := 0;
typeOf(Class3): result := 1;
else
result := 2;
end;
end;
// Examples of usage:
c4.DoSomething(typeOf(Class1));
someC := new Class3;
c4.DoSomething(someC.Class);
如果您不从事Java或需要平台可移植方法,那么您可以使用虚拟类方法在类中合并备用类标识:
Class1 = public class
class method classID: Integer; virtual;
end;
实现此操作以返回一些标识 Class1 的常量。在后代类中重写以为每个类返回适当的ID。然后在 DoSomething 方法中:
method Class4.DoSomething(c: Class1Class): Integer;
begin
case c.classID of
CLASS_2: result := 0;
CLASS_3: result := 1;
else
result := 2;
end;
end;