Construção estilo GObject

Vala suporta um esquema alternativo de construção que é levemente diferente dos descritos anteriormente. Esse esquema é mais parecido com o jeito que os GObject são construidos. Qual você vai preferir vai depender se você veio dos lado dos GObjects ou do Java e/ou C#. O esquema de construção dos GObject introduzem novos elementos sintáticos:

propriedades de construção, uma chamada especial Object(...) e um bloco construct. Vamos dar uma olhada no funcionamento:

public class Person : Object {

    /* Construction properties */
    public string name { get; construct; }
    public int age { get; construct set; }

    public Person(string name) {
        Object(name: name);
    }

    public Person.with_age(string name, int years) {
        Object(name: name, age: years);
    }

    construct {
        // do anything else
        stdout.printf("Welcome %s\n", this.name);
    }
}

Com o esquema de construção do estilo GObject cada método de construção só pode conter uma chamada Object (...) para determinar os tão falados propriedades de construção(construct properties). A chamada Object (...) recebe um variável número de argumentos nomeados na forma de propriedade: valor. Essas propriedades precisam ser declaradas como construct ou set. Elas serão atribuídas com os dados valores e depois todos blocos construct {} na hierarquia do GLib.Object abaixo da nossa classe será chamado.

O bloco construct é garantido de ser chamadoquando uma instância da classe é criada, mesmo se ela for criada como um subtipo. Não tem parâmetros ou retorno de valores. Dentro desse bloco você pode chamar outros métodos e atribuir variáveis membros que forem necessárias.

Propriedades de construção são definidas como propriedades get e set, e portanto podem executar códigos arbitrários na atribuição. Se você precisa fazer inicializações baseado numa única propriedade de construção, é possível escrever um bloco construct personalizado para a propriedade, que será executado imediatamente na atribuição, e antes de outros códigos de construção.

Se uma propriedade de construção é declarada sem set ela será uma tão falada propriedade somente construção, que significa que só pode ser atribuida na construção. No exemplo abaixo name é uma propriedade somente construção.

Aqui temos um sumário de vários tipos de propriedades juntas com nomenclaturas usualmente encontradas na documentação de bibliotecas baseadas em GObject.

public int a { get; private set; }    // Read
public int b { private get; set; }    // Write
public int c { get; set; }            // Read / Write
public int d { get; set construct; }  // Read / Write / Construct
public int e { get; construct; }      // Read / Write-Construct-Only

Em alguns casos você também vai querer executar algumas ações - não quando instâncias das classes são criadas - mas quando a classe propriamente dita é criada na execução dos GObject. Na terminologia dos GObject nós estamos falando sobre os trechos de código que rodam dentro da função class_init para a classe em questão. Em Java isso é conhecido como static initializer blocks(Blocos de inicialização estática). Em Vala isso se parece assim:

/* This snippet of code is run when the class
 * is registered with the type system */
static construct {
  ...
}

results matching ""

    No results matching ""