您如何将氧类引用与类进行比较

  • 本文关键字:比较 引用 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 编译,但实际上,无论传入Class2还是Class3,第一个条件的计算结果始终为 true

目标是以跨平台的方式编写此内容,而无需使用特定于 Oxygene 支持的任何一个平台的代码。

必须为条件中使用的每个类创建类引用,并使用 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;

我不确定为什么要专门测试类类型 - 如果您通过类引用虚拟化类的行为,则不需要这样做,但假设您有理由需要使用类引用的类标识......

你没有说你在哪个平台上工作,但在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;

相关内容

  • 没有找到相关文章

最新更新