Pular para o conteúdo

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.x

Heranç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.kg

Mé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.