如何在Chapel中检查子类

时间:2017-08-29 15:42:39

标签: chapel

这个可能真的很愚蠢。如何在Chapel中检查对象的子类?

class Banana : Fruit {
  var color: string;
}
class Apple: Fruit {
  var poison: bool;
}
class Fruit {
}

var a = new Apple(poison=true);
var b = new Banana(color="green");

// ?, kinda Java-ish, what should I do?
if (type(a) == Apple.class()) {
  writeln("Go away doctor!");
}

虽然我在询问一个子类,但我发现我不知道如何检查它是否属于Fruit class

2 个答案:

答案 0 :(得分:3)

对于确切的类型匹配,您需要写下:

 if (a.type == Apple) {
   writeln("Go away doctor!");
 }

要检查a的类型是否为Fruit的子类型,这将有效:

if (isSubtype(a.type, Fruit)) {
   writeln("Apples are fruit!");
}

作为参考,有一个功能列表,可以类似地用于检查类型信息here

*请注意,if块中的括号不是必需的,因此您可以改为编写:

if isSubtype(a.type, Fruit) {
   writeln("Apples are fruit!");
}

答案 1 :(得分:3)

早期的答案很好地解释了在编译时已知类型的情况,但如果它只在运行时知道怎么办?

class Banana : Fruit {
  var color: string;
}
class Apple: Fruit {
  var poison: bool;
}
class Fruit {
}

var a:Fruit = new Apple(poison=true);
var b:Fruit = new Banana(color="green");

// Is a an Apple?
if a:Apple != nil {
  writeln("Go away doctor!");
}

在这种情况下,如果a实际上不是Apple或带有nil编译时类型Apple如果是。