0

给定以下代码:

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

4

2 回答 2

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;
于 2013-10-13T21:36:48.477 回答
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;
于 2013-10-14T03:30:09.993 回答