3.2. Orientação à Objetos em Dart: Construtores

Diego Dias
Flutter Brasil
Published in
3 min readDec 1, 2021

No último artigo vimos o básico sobre orientação à objetos, hoje veremos construtores que são funções utilizadas para construir o nosso objeto.

class Pessoa {
String nome;
int idade;
double altura;
void dormir(){
print("$nome está dormindo");
}
void aniver(){
idade++;
}
}
void main(){
Pessoa pessoa1 = new Pessoa();
pessoa1.nome = "Diego";
pessoa1.altura = 1.70;
pessoa1.idade = 30;
print(pessoa1.nome);
pessoa1.aniver();
print(pessoa1.idade);
}

No exemplo acima, do artigo passado, nós atribuímos um nome, altura e idade à classe pessoa. Com construtores você pode atribuir estes dados no momento da criação, ou instância, da Pessoa para reduzir o seu código.

Construtor Padrão

Para exemplificar, se dermos um print(pessoa1); irá mostrar "Instance of 'Pessoa'", ou seja, é um objeto que está na memória, mas ainda não está construído, completo. Parece muito com uma função a estrutura do construtor.

Para declarar um construtor, primeiramente vamos para dentro do escopo da classe Pessoa e pegamos o nome desta classe e a declaramos, caso não declaremos, ele irá declarar um escondido, não é obrigado a declarar um construtor vazio (ex. Pessoa();), vejamos o exemplo:

class Pessoa {
String nome;
int idade;
double altura;
Pessoa(String nome, int idade, double altura){
}; // Construtor declarado, se estiver vazio não é obrigado a declarar
void dormir(){
print("$nome está dormindo");
}
void aniver(){
idade++;
}
}

O construtor Pessoa(String nome, int idade, double altura) {} pega o nome, idade e altura declarados acima dele.

A pergunta é: como colocar nome (da classe Pessoa) = nome (do construtor)? para isso existe a palavra this que especifica um atributo (variável) do nosso objeto (a variável declarada no início da classe Pessoa) e não do nosso parâmetro do construtor Pessoa.

Assim, this traduzindo seria 'este', mas o que isso significa aí no construtor? quer dizer que 'nesta classe queremos acessar tal atributo', this.nome, vejamos:

class Pessoa {
String nome;
int idade;
double altura;
Pessoa(String nome, int idade, double altura){
this.nome = nome;
this.idade = idade;
this.altura = altura;
};
void dormir(){
print("$nome está dormindo");
}
void aniver(){
idade++;
}
}

Construtor Parametrizado

O interessante é que em Dart você pode fazer melhor, vejamos:

class Pessoa {
String nome;
int idade;
double altura;
// Este construtor faz a mesma coisa que o anterior, mas em uma só linha
Pessoa(this.nome, this.idade = idade, this.altura);
void dormir(){
print("$nome está dormindo");
}
void aniver(){
idade++;
}
}

Como já instanciamos o construtor, podemos fazer da seguinte forma, dê uma olhada como era antes:

void main(){
Pessoa pessoa1 = new Pessoa();
pessoa1.nome = "Diego";
pessoa1.altura = 1.70;
pessoa1.idade = 30;
print(pessoa1.nome);
pessoa1.aniver();
print(pessoa1.idade);
}

E agora como fica depois que já criado o construtor da classe Pessoa:

void main(){
Pessoa pessoa1 = new Pessoa("Diego", 30, 1.80);
print(pessoa1.nome);
pessoa1.aniver();
print(pessoa1.idade);
}

Viram como ficou mais limpo o código? Esta é a base de programação, em praticamente tudo você irá usar isso.

Named Constructors (Construtor Nomeado)

É outro tipo de construtor, é um construtor diferenciado para quando se tem parâmetros diferentes, seria um construtor que tem um nome:

class Pessoa {
String nome;
int idade;
double altura;
Pessoa(this.nome, this.idade = idade, this.altura);// Named Constructors, neste caso aqui eu só quero mudar o parâmetro nome e altura, idade será igual para todos, ou seja, 0
Pessoa.nascer(this.nome, this.altura){
idade = 0;
// Posso chamar outras funções aqui dentro também quando for instanciada
print("$nome nasceu!");
dormir();
};
void dormir(){
print("$nome está dormindo");
}
void aniver(){
idade++;
}
}

Para poder chamar este named constructors eu faço o seguinte em “void main();”:

void main(){
Pessoa nene = Pessoa.nascer("Pedro", 0.30);
print(nene.nome);
print(nene.idade);
}

No caso acima irá mostrar no nosso console as seguintes mensagens:

Pedro nasceu!
Pedro está dormindo!
0

Você também pode usar os construtores da seguinte forma:

class Person {  
final String _name;
final int _age;
Person({String? name, int? age})
: _name = name!,
_age = age!;

}

Pronto, no próximo artigo iremos ver Getters e Setters, não percam.

--

--