Você está na página 1de 45

DESENVOLVIMENTO DE

APLICATIVOS MOVEIS

3º Desenvolvimento de Sistemas Nataniel de Aguiar


EEEP Salomão Alves de Moura nataniel.silva@prof.ce.gov.br
1
Orientação a Objetos Com Dart/Flutter

• Por que usar orientação a objetos?


• Com o uso da Orientação a Objetos,
conseguimos criar um reaproveitamento
e organização de código muito grande,
consequentemente tornando a
manutenção do mesmo mais fácil e
simples.

2
3
Orientação a Objetos Com
Dart/Flutter

• Programação Orientada a Objetos?


• Podemos dizer que orientação a objetos
basicamente é um modelo de
programação baseado na criação de
Classes (receitas de bolo), nelas
definimos como (atributos) e o que
(métodos ou funções) nossos objetos
irão ser ou fazer.
4
Abstração - Mundo real vs Minimundo

• O principal pilar da Orientação a Objetos é o conceito de


abstração, que é a capacidade isolar um elemento ou
pensamento dentro de um contexto maior. Podemos então usar
a ideia de mundo real como esse que vivemos, nós reconhecemos
as coisas do mundo por suas características (cor, tamanho, formas
etc), mas quando tratamos de um problema específico, nós
pensamos apenas nos elementos que são importantes para
resolve-lo.

5
Abstração - Mundo real vs Minimundo

• A abstração é utilizada para a definição de entidades(pessoa,


carro, conta no banco, etc) do mundo real. Essas entidades são
representações de tudo que é real, tendo como consideração as
suas características(ex: pessoa tem nome, idade, altura, etc) e
ações(ex: essa pessoa fala, ouve, anda, etc).

6
Abstração - Mundo real vs Minimundo

• Imagine do que você precisa


pra trocar uma lâmpada, você
deve lembrar logo de objetos
como a escada para subir e a
nova lâmpada.

7
Abstração - Mundo real
vs Minimundo

• Esse ambiente especifico que nós criamos


para trocar a lâmpada é o que chamamos
de Minimundo, uma abstração do mundo
real, composto por objetos, ações,
eventos e estados. As linguagens de
programação oferecem recursos para
você descrever o minimundo, vamos ver
como fazer isso.
8
Definindo nossa “receita de bolo”

• Nossas Classes são parecidas com


receitas de bolo, sabendo disso, como
podemos começar essa criação? Imagine
uma classe do tipo Pessoa, pensando em
como uma pessoa deve ser, ou seja, o que
uma pessoa tem, o que podemos definir?

9
Definindo nossa “receita de bolo”

• Definição em pseudo código de uma classe Pessoa que tem atributos (Nome, Idade, Sexo e Data de
Nascimento) 10
Criando nossa classe

• Partindo do exemplo anterior, vamos


transformar nossa receita de bolo em uma
classe Dart, o primeiro passo é
definirmos um nome para a classe:

11
Criando nossa classe

• Certo, agora, precisamos informar onde a


classe começa { e onde termina }:

12
Criando nossa classe

• Até o momento temos apenas uma palavra


Pessoa seguida por chaves, para definirmos uma
classe podemos utilizar a palavra reservada class.

13
Descrevendo nossos atributos

• Os ingredientes da receita são chamados de atributos em classes, assim como


fizemos mais cedo utilizando o tem nome, tem idade, etc… Então, como podemos
definir o que uma classe pessoa tem? Para isso podemos utilizar construtores
(constructors).

14
Descrevendo nossos atributos

classe Pessoa com seus atributos, seus tipos e função de construtor


15
Descrevendo nossos atributos

• Definimos nossa classe, demos um nome para ela e definimos seus atributos, o
próximo passo será criar um comportamento (método) para ela.

16
Criando comportamentos

• Pensando em comportamentos de uma pessoa, o que poderíamos criar? Toda


pessoa deve ser capaz de dizer o seu nome e sua idade, ou seja, se apresentar,
então, vamos criar esse comportamento:

17
Criando comportamentos

18
Criando comportamentos

• Um comportamento basicamente é uma função dentro de nossa classe,


definimos e criamos de forma parecida com funções (functions) normais em Dart,
e atribuímos opcionalmente o tipo de retorno da função, nesse caso não há
retorno por isso o uso da palavra reservada void.

19
Criando comportamentos

• O comportamento de nossa classe Pessoa será apenas um print dizendo seu


nome e sua idade, algo parecido com:

• Olá, meu nome é Igor, eu tenho 26 anos.

20
Criando nosso objeto

• Tudo certo, como podemos começar a utilização de nossas classes para as


criações de objetos?
• Podemos criar nossos objetos através da palavra reservada new seguida pelo
nome da classe que desejamos instanciar (criar um objeto):

21
Criando nosso objeto

• Mas e aquele tal de construtor, onde fica? Repare que a ordem dos parâmetros
seguem respectivamente a ordem definida em nosso construtor:

22
Criando nosso objeto

• Em outras palavras, um construtor serve para isso, ele será chamado durante a
criação do objeto de uma determinada classe, podemos passar parâmetros para a
classe e executar determinadas validações ou funções dentro desse contexto.

construtor modificado para avaliar de atributo nome é nulo ou vazio 23


Utilizando um objeto

• Show de bola, já temos nosso objeto criado e guardado em uma variável:


• Agora, como podemos chamar o comportamento (função) para se apresentar?
Podemos fazer isso da mesma maneira que fazemos com funções:

24
Utilizando um objeto
class Pessoa { void apresentar() {
String nome; print("Olá, meu nome é ${this.nome} e eu tenho
int idade; ${this.idade} anos");
String sexo; }
DateTime dataDeNascimento; }

Pessoa(this.nome, this.idade, this.sexo, void main() {


this.dataDeNascimento) { var pessoa = new Pessoa("Igor", 26, "Masculino",
// validação do nome DateTime(1995));
if (this.nome == null || this.nome.isEmpty) { pessoa.apresentar();
throw Exception("Nome precisa ser }
preenchido");
}
25
}
Encapsulamento

• Um outro princípio da Programação Orientada a Objetos é o


Encapsulamento. O Encapsulamento é um mecanismo de ocultação de
detalhes de implementação de um objeto. Em outras palavras, ele
protege o código interno e os dados internos do objeto de serem
acessados diretamente de fora do objeto.

26
Encapsulamento

• Em Dart, o encapsulamento é implementado usando modificadores de


acesso. Existem dois tipos de modificadores de acesso em Dart - 'public' e
'private'. Por padrão, todas as classes, variáveis, métodos, etc., são publicamente
acessíveis, a menos que sejam explicitamente declarados como privados.
• Para tornar uma variável ou método privado em Dart, prefixamos seu nome com
um sublinhado '_’.
double _saldo;

27
Encapsulamento
class contaBancaria {
int numeroDaConta;
double _saldo;

contaBancaria(this.numeroDaConta, this._saldo);

double get saldo {


return _saldo;
}

set saldo(double novoSaldo) {


_saldo = novoSaldo;
}
28
}
Encapsulamento
import 'encapsulamento.dart';

void main(List<String> args) {


// TESTANDO ENCAPSULAMENTO
final conta1 = new contaBancaria(61760, 1000.00);
print(conta1.saldo);
print(conta1._saldo); // UM ERRO NESTA LINHA
}

29
Herança

• A herança é um princípio fundamental da programação orientada a objetos


que permite que uma classe herde os campos e métodos de outra. Em Dart, a
herança é implementada através da palavra-chave 'extends’.
• Quando uma classe é declarada como herdeira de outra classe, ela se torna uma
subclasse e a classe da qual herda se torna a superclasse.

30
Herança

class Animal { import 'animal.dart';


void respirar() { class Cachorro extends Animal {
print('Respirando...'); void latir() {
} print('Latindo...');
} }
}

31
Herança - Sobrescrita de métodos

• Em Dart, uma subclasse pode substituir um método de sua superclasse usando a


palavra-chave 'override'. Isso permite que a subclasse forneça uma
implementação diferente de um método que já está fornecido por sua superclasse.

• @override
• void respirar() {
• // TODO: implement respirar
• super.respirar();
• }
32
Polimorfismo

• Polimorfismo é um conceito fundamental na programação orientada a objetos. Ele


permite que objetos de diferentes tipos sejam tratados como objetos de um
tipo comum. O termo "polimorfismo" vem das palavras gregas "polys", que
significa "muitos", e "morphē", que significa "forma". Portanto, polimorfismo
significa a capacidade de assumir várias formas.

33
Polimorfismo

• Em Dart, o polimorfismo é implementado usando classes abstratas,


interfaces e herança. Uma classe abstrata é uma classe que não pode ser
instanciada diretamente. Em vez disso, ela é usada como uma classe base para
outras classes.

34
Polimorfismo

• Uma interface é um contrato que especifica o que uma classe deve fazer,
mas não como ela deve fazer. Uma classe que implementa uma interface deve
fornecer uma implementação para todos os métodos definidos na interface

35
Polimorfismo em Dart

• Em Dart, podemos ter polimorfismo de duas formas: polimorfismo de tempo de


compilação e polimorfismo de tempo de execução. O polimorfismo de tempo
de compilação, também conhecido como sobrecarga de método, ocorre
quando temos dois ou mais métodos com o mesmo nome, mas com
diferentes listas de parâmetros. Dart não suporta sobrecarga de método,
então só temos polimorfismo de tempo de execução em Dart.

36
Polimorfismo em Dart

• O polimorfismo de tempo de execução, também conhecido como


substituição de método, ocorre quando uma classe filha fornece uma
implementação diferente para um método que já está fornecido por sua
classe pai. Em Dart, usamos a palavra-chave 'override' para indicar que estamos
substituindo um método.

37
Polimorfismo em Dart
• abstract class Animal { • void comer() {
• void comer(); • print('O gato está comendo');
• } • }
• ----------------------------------------------- • }
• import 'animal.dart'; • ----------------------------------------------------------
• class Cachorro extends Animal { • void main() {
• @override • Animal outroCachorro = new
• void comer() { Cachorro();
• print('O cachorro está comendo'); • Animal outroGato = Gato();
• } • outroCachorro.comer(); // prints 'O
• } cachorro está comendo'
• ---------------------------------------------- • outroGato.comer(); // prints 'O gato está
• import 'animal.dart'; comendo'
• class Gato extends Animal {
• @override • } 38
Polimorfismo em Dart

• Em resumo, o polimorfismo permite que tratemos objetos de diferentes tipos


de forma uniforme. Ele aumenta a flexibilidade e a modularidade do nosso
código, tornando-o mais reutilizável e fácil de manter.

39
Polimorfismo em Dart

• Agora, podemos criar objetos de Cachorro’ e Gato' e tratá-los como 'Animal'. Isso
é polimorfismo. Podemos chamar o método comer' em um objeto 'Animal', e a
implementação correta do método será chamada com base no tipo real do objeto.

40
E o This?

• Quem é this?
• Para que serve o this?
• Porque usar o this?
• Quando usar o this?

41
E o This?

• Quem é this?
• Quando utilizamos this trata-se do próprio escopo atual onde o mesmo
está sendo referenciado, ou seja, dentro da classe o this nada mais é do
que uma referência da própria classe.

42
E o This?

• Para que serve o this?


• Para referenciarmos a própria classe (tratando-se apenas de OO)
dentro de funções ou métodos.

43
E o This?

• Porque usar o this?


• Para referenciar atributos ou funções da própria classe dentro de
outras funções da mesma classe.

44
E o This?

• Quando usar o this?


• Quando precisa-se invocar ou pegar valores de atributos ou funções
da própria classe.

45

Você também pode gostar