Sobrecarga
overload: variantes da mesma ação escolhidas pela aridade e pelos tipos, com empate recusado.
Uma linguagem dinâmica não precisa de sobrecarga para aceitar tipos diferentes — um given typeof(x) resolve. O que ela ganha com sobrecarga é declarar as formas aceitas, e deixar a linguagem recusar a que não serve com a lista das que servem.
dataforge
overload action formatar(valor: Integer):
yield $"{valor}"
overload action formatar(valor: Float):
yield $"{round(valor, 2)}"
overload action formatar(valor: String, largura: Integer):
yield valor.ljust(largura)
assert formatar(3) is "3"
assert formatar(2.5) is "2.5"
assert formatar("ab", 4) is "ab "
monitor:
formatar(yes)
assert no
handle OverloadResolutionError as e:
out e.messageComo a variante é escolhida#
- descarta as que não aceitam a quantidade e os nomes dos argumentos;
- confere os tipos declarados, com a mesma regra de qualquer anotação (um
Integerserve onde se pedeFloat); - entre as que sobram, vence a que declara mais tipos — a mais específica;
- um empate é
AmbiguousOverloadError. Escolher pela ordem de escrita faria mover uma variante de lugar mudar um programa que não a chama.
Construtores sobrecarregados#
dataforge
blueprint Cor:
r := 0
g := 0
b := 0
overload action setup(cinza: Integer):
self.r := cinza
self.g := cinza
self.b := cinza
overload action setup(r: Integer, g: Integer, b: Integer):
self.r := r
self.g := g
self.b := b
assert (spawn Cor(128)).g is 128
assert (spawn Cor(1, 2, 3)).b is 3