Blueprints
A classe do DataForge: setup, métodos, herança e traits.
O básico#
dataforge
blueprint Pessoa:
nome: String := ""
idade: Integer := 0
action setup(nome, idade):
self.nome := nome
self.idade := idade
action apresentar():
yield $"{self.nome}, {self.idade} anos"
p := spawn Pessoa("Ana", 30)
out p.apresentar()setup é o construtor, e roda no spawn. self é a instância — sempre explícito, como em Python.
Parâmetros no cabeçalho#
A forma curta, quando o construtor só atribui:
dataforge
blueprint Ponto(x, y):
action mover(dx, dy):
yield spawn Ponto(self.x + dx, self.y + dy)
p := spawn Ponto(1, 2)
out p.xHerança#
dataforge
blueprint Documento:
titulo: String := ""
action setup(titulo):
self.titulo := titulo
action cabecalho():
yield $"# {self.titulo}"
action render():
yield self.cabecalho()
blueprint Artigo extends Documento:
autor: String := ""
action setup(titulo, autor):
self.titulo := titulo
self.autor := autor
// acrescenta ao do pai, em vez de refazer
action cabecalho():
yield root.cabecalho() + $"\npor {self.autor}"root chama a versão do pai. Um método do pai que chama self.x() resolve para a sobrescrita do filho — é o polimorfismo funcionando sem nenhuma marcação.
Traits#
dataforge
trait Comparavel:
action comparar(outro) // exigência, sem corpo
action maior_que(outro): // implementação padrão
yield self.comparar(outro) bigger 0
blueprint Peso with Comparavel:
kg: Float := 0.0
action setup(kg):
self.kg := kg
action comparar(o):
yield self.kg - o.kgMétodo sem corpo é exigência; com corpo, é herdado. O contrato é conferido na declaração do blueprint — veja abstratos.
Múltiplos traits#
dataforge
blueprint X extends Base with Serializavel, Comparavel:
…extends é um só; with aceita vários. Trait não guarda estado, então não há o problema de herança múltipla de campos.