这个可能真的很愚蠢。如何在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。
答案 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
如果是。