Conteúdo estudado no curso Dart: entendendo a Orientação a Objetos, ensinado pelos instrutores Kako (Caio Couto Moreira) e Ricarth Lima na plataforma Alura.
- Funções: Técnica para isolar um trecho de código com o objetivo de reutilizá-lo.
class
: Como criar uma classe e definir suas propriedades, construtores e métodos.extends
: Como estender uma classe para herdar suas propriedades e métodos.abstract
: Como criar uma classe abstrata para que contém métodos abstratos que serão usados pelas classes que a implementarem.implements
: Como implementar uma classe abstrata em uma classe concreta.
Existem diversos tipos de paradigmas da programação, como Funcional, Procedural, e Orientação a Objetos.
Qual a diferença entre Linguagem e Paradigma? Paradigma é uma ideia que rege uma linguagem, ou seja, cada linguagem adota determinado paradigma/regra na sua criação.
Exemplo de função do tipo
bool
que recebe uma quantidade de dias e retorna se uma fruta está ou não madura:
bool funcEstaMadura(int dias) {
if (dias >= 30) {
return true;
} else {
return false;
}
}
Existem diversos tipos de parâmetros, Posicionais Obrigatórios, Nomeados Opcionais, Parâmetros com "Padrão" e com Modificador Required:
Parâmetros posicionais obrigatórios devem estar numa determinada ordem e devem sempre ser fornecidos na chamada da função.
- Exemplo:
funcEstaMadura(String nome, int dias) {
if (dias >= 30) {
print("A $nome está madura");
} else {
print("A $nome está madura");
}
}
Parâmetros nomeados opcionais não precisam estar em determina posição mas recebem um nome para identificar na chamada da função.
- Exemplo:
funcEstaMadura(String nome, int dias, {String? cor}) {
if (dias >= 30) {
print("A $nome está madura");
} else {
print("A $nome está madura");
}
if (cor != null) {
print("A $nome é $cor");
}
}
Parâmetros Parâmetros com "Padrão" são parâmetros que recebem um valor padrão para caso não receba nenhuma informação na chamada da função.
- Exemplo:
funcEstaMadura(String nome, int dias, {String cor = "Verde"}) {
if (dias >= 30) {
print("A $nome está madura");
} else {
print("A $nome está madura");
}
print("A $nome é $cor");
}
Parâmetros com Modificador Required são parâmetros obrigatórios, geralmente usamos quando queremos nomear um parâmetro e ao mesmo tempo obrigar a ser necessário/requerido.
- Exemplo:
funcEstaMadura(String nome, int dias, {required String cor}) {
if (dias >= 30) {
print("A $nome está madura");
} else {
print("A $nome está madura");
}
print("A $nome é $cor");
}
Escopos são áreas de código em que tudo que está dentro dele pode ser usado apenas por ele. Por exemplo, uma função possui seu escopo determinado por {}
e o que for criado dentro dela pertence a ela.
Classes são utilizadas para representarmos objetos que possuem semelhanças em seus conceitos, características e ações. Exemplo:
class Fruta {
String nome;
double peso;
String cor;
String sabor;
int diasDesdeColheita;
bool? isMadura;
Fruta(this.nome, this.peso, this.cor, this.sabor, this.diasDesdeColheita,
{this.isMadura});
}
Instancação do objeto do tipo
Fruta
:
Fruta fruta = Fruta("Uva", 40, "Roxa", "Doce", 20);
📢 Pode-se realizar ações dentro de um construtor, exemplo:
Fruta.minusculas(this.nome, this.cor){
nome = nome.toLowerCase();
cor = cor.toLowerCase();
}
Herança é uma das características de OO, permite que classes compartilhem entre si propriedades e métodos, assim, reaproveitando código utilizando os conceitos de generalização (classe mãe com conceitos gerais do objeto) e especificação (classe filha com conceitos mais especifícos). Exemplo:
class Alimento {
String nome;
double peso;
String cor;
Alimento(this.nome, this.peso, this.cor);
printAlimento() {
print('Este(a) $nome pesa $peso gramas e é $cor.');
}
}
class Legumes extends Alimento {
bool isPrecicaCozinhar;
Legumes(super.nome, super.peso, super.cor, this.isPrecicaCozinhar);
}
Classes abstratas são como moldes que obrigam as classes que a implementam a ter método obrigatórios.
Exemplo:
abstract class Bolo {
void separarIngredientes();
void fazerMassa();
void assar();
}
class Legume extends Alimento implements Bolo {
//...
@override
void assar() {
// TODO: implement assar
}
@override
void fazerMassa() {
// TODO: implement fazerMassa
}
@override
void separarIngredientes() {
// TODO: implement separarIngredientes
}
}
Polimorfismo é a habilidade de um método que veio de uma classe mãe, para isso usamos o @override
, exemplo:
@override
void fazerMassa() {
print('Tirar a casca');
super.fazerMassa();
}
Para executar qualquer um dos códigos você pode clonar o repositório, abrir a pasta do projeto e executar o arquivo .dart
:
git clone https://github.com/jhoisz/Dart_OO
cd Dart_OO/bin
dart nomeDoCodigo.dart