你如何比较氧基类参考类?

时间:2013-10-13 21:36:48

标签: oxygene

给出以下代码:

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支持的任何一个平台的代码。

2 个答案:

答案 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;