How to check subclass in Chapel

82 Views Asked by At

This one is probably really stupid. How do you check the subclass of an object in 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!");
}

Though I'm asking about a subclass, I realize I don't know how to check if it's a Fruit class either.

2

There are 2 best solutions below

1
On BEST ANSWER

For an exact type match, you will want to write this:

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

To check if the type of a is a subtype of Fruit, this will work:

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

For reference, there's a list of functions that can similarly be used to check type information here

*Note that the parentheses in the if blocks are not necessary, so you could write this instead:

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

The earlier answer does a fine job of explaining the case in which the type is known at compile time, but what if it's only known at run-time?

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!");
}

In this case the dynamic cast of a to its potential subtype Apple results in nil if it wasn't in fact an Apple or an expression with compile-time type Apple if it was.