1

这个大概是真的傻。如何检查 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

4

2 回答 2

3

对于精确的类型匹配,您需要这样写:

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

要检查 of 的类型是否a是 的子类型Fruit,这将起作用:

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

作为参考,这里有一个类似可用于检查类型信息的函数列表

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

if isSubtype(a.type, Fruit) {
   writeln("Apples are fruit!");
}
于 2017-08-29T15:56:59.580 回答
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或一个具有编译时类型的表达式,Apple如果它是的话。

于 2017-09-05T17:47:41.790 回答