Mobile App Development · Dart/Flutter
Seis exercícios progressivos: classe simples, método com formatação, lógica interna, construtor nomeado, encapsulamento com getter e lista de objetos.
Exercício
Cria a classe Pessoa com dois atributos, um construtor posicional (this.nome, this.idade) e um método apresentar() que usa os atributos da instância.
// Demonstração de criação de uma classe simples em Dart.
// Uma classe é um modelo (blueprint) que define atributos e comportamentos de objetos.
// Um objeto é uma instância concreta de uma classe.
// Classe 'Pessoa' com dois atributos e um método.
class Pessoa {
// Atributos: representam as características do objeto.
String nome;
int idade;
// Construtor: inicializa os atributos quando um objeto é criado.
// 'this.nome' e 'this.idade' são atalhos que atribuem os parâmetros diretamente.
Pessoa(this.nome, this.idade);
// Método: define um comportamento da classe (uma ação que o objeto pode realizar).
void apresentar() {
// Acessa os atributos da instância atual usando seus nomes diretamente.
print('$nome tem $idade anos');
}
}
void main() {
// Cria um objeto (instância) da classe Pessoa com os valores fornecidos.
Pessoa pessoa = Pessoa('Ana', 24);
// Chama o método 'apresentar' no objeto criado.
pessoa.apresentar();
}
Saída esperada
Ana tem 24 anos
Como executar
dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_01_pessoa.dart
Exercício
Cria a classe Produto com construtor posicional e um método exibirResumo() que formata nome e preço com toStringAsFixed(2).
// Demonstração de classe com método de exibição formatada.
// A classe 'Produto' encapsula dados e comportamento relacionados a um produto.
class Produto {
// Atributos públicos que definem as propriedades do produto.
String nome;
double preco;
// Construtor posicional: os valores são passados na ordem declarada.
Produto(this.nome, this.preco);
// Método que exibe um resumo do produto com nome e preço formatado.
void exibirResumo() {
// \$ exibe o símbolo de real literalmente; toStringAsFixed(2) garante 2 decimais.
print('$nome - R\$ ${preco.toStringAsFixed(2)}');
}
}
void main() {
// Instancia um objeto Produto com nome 'Mouse' e preço 89.90.
Produto produto = Produto('Mouse', 89.90);
// Chama o método de exibição — saída esperada: "Mouse - R$ 89.90".
produto.exibirResumo();
}
Saída esperada
Mouse - R$ 89.90
Como executar
dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_02_produto.dart
Exercício
Cria a classe Aluno com dois métodos: calcularMedia() e classificarSituacao(), este último reutilizando o primeiro internamente e retornando um texto de acordo com faixas de nota.
// Demonstração de classe com múltiplos métodos e lógica interna.
// A classe 'Aluno' encapsula notas e regras de aprovação.
class Aluno {
// Atributos: nome e as duas notas do aluno.
String nome;
double primeiraNota;
double segundaNota;
// Construtor posicional que inicializa todos os atributos.
Aluno(this.nome, this.primeiraNota, this.segundaNota);
// Método que calcula e retorna a média aritmética das duas notas.
double calcularMedia() {
return (primeiraNota + segundaNota) / 2;
}
// Método que classifica a situação do aluno com base na média calculada.
// Chama internamente 'calcularMedia()' para reutilizar a lógica.
String classificarSituacao() {
double media = calcularMedia();
if (media >= 7) {
return 'Aprovado';
}
if (media >= 5) {
return 'Recuperacao';
}
return 'Reprovado';
}
}
void main() {
// Cria um aluno com notas 8.0 e 6.5 → média = 7.25 → Aprovado.
Aluno aluno = Aluno('Lucas', 8.0, 6.5);
// Chama os métodos e exibe os resultados formatados.
print('Media: ${aluno.calcularMedia().toStringAsFixed(2)}');
print('Situacao: ${aluno.classificarSituacao()}');
}
Saída esperada
Media: 7.25 Situacao: Aprovado
Como executar
dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_03_aluno.dart
Exercício
Cria a classe Usuario com um construtor padrão e um construtor nomeado Usuario.convidado(), que inicializa os atributos com valores fixos usando lista de inicialização (:).
// Demonstração de construtores nomeados em Dart.
// Além do construtor padrão, podemos criar construtores com nomes alternativos
// para diferentes formas de inicializar o objeto.
class Usuario {
String nome;
bool ativo;
// Construtor padrão: cria um usuário com nome e estado de ativo informados.
Usuario(this.nome, this.ativo);
// Construtor nomeado 'convidado': cria um usuário visitante com valores pré-definidos.
// Útil para criar objetos com configurações padrão sem repetir código.
Usuario.convidado() : nome = 'Visitante', ativo = false;
// Método que exibe as informações do usuário de forma compacta.
void exibir() {
print('Usuario: $nome | Ativo: $ativo');
}
}
void main() {
// Usa o construtor padrão para criar um usuário normal.
Usuario usuario = Usuario('Marina', true);
// Usa o construtor nomeado para criar um usuário convidado.
Usuario convidado = Usuario.convidado();
// Exibe as informações de cada instância criada.
usuario.exibir();
convidado.exibir();
}
Saída esperada
Usuario: Marina | Ativo: true Usuario: Visitante | Ativo: false
Como executar
dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_04_construtor_nomeado.dart
Exercício
Cria a classe ContaBancaria com um atributo privado _saldo, um getter somente leitura e métodos depositar()/sacar() que validam os valores antes de alterar o saldo.
// Demonstração de encapsulamento com atributo privado e getter em Dart.
// Encapsulamento: ocultar detalhes internos e expor apenas o necessário.
// Atributos privados são declarados com underscore (_) antes do nome.
class ContaBancaria {
// Atributo privado: só pode ser acessado dentro desta classe.
// O underscore (_) torna '_saldo' invisível fora do arquivo.
double _saldo = 0;
// Getter: propriedade somente leitura que expõe '_saldo' de forma segura.
// 'get' permite ler o valor sem permitir alteração direta de fora.
double get saldo => _saldo;
// Método para depositar: só adiciona ao saldo se o valor for positivo.
void depositar(double valor) {
if (valor > 0) {
_saldo += valor;
}
}
// Método para sacar: só realiza o saque se o valor for positivo e houver saldo suficiente.
void sacar(double valor) {
if (valor > 0 && valor <= _saldo) {
_saldo -= valor;
}
}
}
void main() {
ContaBancaria conta = ContaBancaria();
// Deposita R$ 200 na conta.
conta.depositar(200);
// Saca R$ 75 — verificação interna garante que o saldo não ficará negativo.
conta.sacar(75);
// Acessa o saldo via getter — resultado esperado: R$ 125.00.
print('Saldo: R\$ ${conta.saldo.toStringAsFixed(2)}');
}
Saída esperada
Saldo: R$ 125.00
Como executar
dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_05_conta_bancaria.dart
Exercício
Combina coleções com classes: cria uma List<Produto> com objetos instanciados diretamente dentro da lista e percorre com for-in.
// Demonstração de lista de objetos — combinando coleções com classes.
// Cada elemento da lista é uma instância da classe Produto.
class Produto {
// Atributos que descrevem o produto.
String nome;
double preco;
// Construtor posicional para inicializar nome e preço.
Produto(this.nome, this.preco);
}
void main() {
// List<Produto>: lista tipada que só aceita objetos do tipo Produto.
// Os objetos são criados diretamente dentro da lista usando o construtor.
List<Produto> produtos = [
Produto('Mouse', 89.90),
Produto('Teclado', 150.00),
Produto('Monitor', 900.00),
];
// Percorre cada produto da lista usando for-in (para cada elemento em...).
for (Produto produto in produtos) {
// Acessa os atributos de cada objeto individualmente.
print('${produto.nome}: R\$ ${produto.preco.toStringAsFixed(2)}');
}
}
Saída esperada
Mouse: R$ 89.90 Teclado: R$ 150.00 Monitor: R$ 900.00
Como executar
dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_06_lista_objetos.dart