Overloads provide two axes by which you can create variants of a method: they let you omit arguments by supplying a reasonable default, and they let you pass in a value whose type is similar to (but different from) the “main” type. For instance, you can imagine a method
add(double n, RoundingMode mode)
with an overload add(long n)
. That second overload would call the first variant, casting the long
to double
and using RoundingMode.HALF_UP
.Lots of languages let you omit arguments by providing default values:
add(n, mode=HALF_UP)
or similar. Effes will, too, but it’s tough for a statically typed language to handle the arg-of-similar-type problem. The only thing you can really do is to accept a supertype, like add(Number n)
. But to do that, you need control over the type hierarchy, which you obviously may not have.In Effes, you can use disjunctive types instead:
add(n: Double|Long):
d = case n of
Double: n
Long: n toDouble -- e.g., if there's no automatic type promotion
...
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.