-
Title:
Herança de Comportamento
-
Description:
Conceitos sobre o princípio de herança de comportamento no contexto da linguagem de programação em Java.
-
Vamos voltar à aplicação Just Java
por um momento.
-
Vejamos a classe MainActivity >
método displayMessage.
-
As coisas começam a fazer
um pouco mais de sentido aqui.
-
Já percebemos que estamos
tentando criar uma variável
-
chamada
orderSummaryTextView.
-
E o tipo de informação
desta variável é TextView.
-
Mas ainda não havíamos
entendido essa parte.
-
Na linha seguinte, ordenamos
um método a este objeto TextView.
-
Usamos o mesmo nome da variável
que foi declarada aqui em cima.
-
Para podermos chamá-la
orderSummaryTextView.setText.
-
Depois passamos um string
como entrada para o método.
-
Esta mensagem de string
chegou originalmente
-
com um parâmetro de entrada
do método displayMessage.
-
Vamos passar para esta parte
do código que ainda não entendemos.
-
Parece que findViewById
é uma ordem de método,
-
porque precede estes parêntesis
com o que parece ser
-
um argumento de entrada.
-
Mas o que é estranho
é que este método
-
não se encontra definido
em parte nenhuma da classe.
-
Se eu clicar duas vezes neste nome,
carregando em Command+F,
-
ou Control+F
se estiver em Windows,
-
podemos tentar fazer
uma procura neste arquivo.
-
Vejo apenas duas ocorrências
de findViewByID
-
e são usadas
de modos semelhantes.
-
Mas não vejo um método
que se chame findViewById.
-
A propósito, anteriormente,
na classe MainActivity,
-
viamos uma ordem para
setContentView.
-
Mas se a procurarmos no arquivo
também não se encontra
-
definida na MainActivity.
-
Então, onde estão definidos
estes métodos?
-
Na verdade, o MainActivity
é um arquivo bem pequeno.
-
Tem apenas cerca de 90 linhas.
Mas esta classe tem mais do que aparenta.
-
O código diz
extends.AppCompatActivity.
-
Isso significa que MainActivity
-
é uma extensão da funcionalidade
na classe AppCompatActivity.
-
No seu computador, se ao invés
aparece ActionBarActivity aqui,
-
não há problema pois trata-se
de uma versão mais antiga disto.
-
A versão mais recente que deve usar
é a AppCompatActivity.
-
Esta oferece suporte de compatibilidade
com versões anteriores
-
em aparelhos Android mais antigos.
-
A atividade AppCompatActivity faz parte
da biblioteca de suporte Android.
-
Permite-nos usar os mais recentes
atributos de UI da Android,
-
enquanto ainda trabalhamos
em aparelhos Android mais antigos.
-
Ao extender a classe
AppCompatActivity
-
obtemos todas as funcionalidades,
estados e métodos daqui,
-
de dentro da MainActivity,
gratuitamente.
-
Não temos de copiar/colar
qualquer código daqui.
-
Podemos apenas
extender essa classe.
-
Se desejar, pode encontrar mais informação
sobre AppCompatActivity no Google.
-
Aqui está o documento de referência
da lição sobre AppCompatActivity.
-
Visto que eu tenho a extensão do Chrome
instalada, posso ver a fonte também.
-
E este é o código segundo o qual
a lição sobre AppCompatActivity
-
se encontra definida.
-
Podemos ver que tem
muitas funcionalidades aqui.
-
Mas a mensagem principal
é que você não tem de saber
-
como elas são implementadas.
-
Tudo o que precisa saber
é que quando você
-
usa extend AppCompatActivity
obtém todas esta funcionalidade de graça.
-
Num nível superior,
pode visualizá-la do seguinte modo:
-
Esta é uma definição de classe
da MainActivity
-
e suponhamos que tem
alguns métodos definidos aqui.
-
Quando extendemos AppCompatActivity,
podemos acessar o estado e os métodos
-
da AppCompatActivity.
-
Eles não se encontram
fisicamente adicionados
-
à classe da MainAcitvity,
mas pode imaginar que eles estão lá,
-
porque ainda pode referenciar
o estado assim como os métodos.
-
E esta torre de código
pode referir-se a coisas como
-
ContentView ou findViewByID
porque herdamos esses métodos.
-
Não os definimos na MainActivity.
-
A MainActivity é exibida
como uma tela no aparelho.
-
Mas nós não escrevemos o código
para isso na MainActivity.
-
Também o herdamos.
-
Não temos o estado nem os métodos
da AppCompatActivity
-
diretamente na classe, mas agora
sabemos que estão lá
-
e podemos referenciá-los.
-
Falando em herdar,
há vantagens e desvantagens.
-
Podemos desejar herdar o comportamento
mas, por vezes, podemos querer
-
modificá-lo um pouco.
-
Se quiser modificar parte
do comportamento desta classe herdada,
-
pode sobrepor
alguns dos métodos.
-
Pode adicionar este @override
em cima de um método
-
para que o computador saiba
que você não quer a versão
-
do método de AppCompatActivity
e que quer antes a versão
-
que definiu aqui.
-
Este ponto é complicado
e requer muita prática.
-
Mas já vimos um exemplo
de sobreposição de um método
-
da classe AppCompatActivity.
-
e esse método é o onCreate.
Ao substituir o onCreate na MainActivity,
-
especificamos nossa própria implementação
para o que vai acontecer quando o método
-
for ordenado.
-
Não se preocupe se não entender logo.
-
Estou apenas dando um breve resumo
de várias noções de programação por objetos.
-
É perfeitamente normal
que ainda tenha perguntas
-
e necessite de ler mais um pouco
antes de os entender na totalidade.
-
Uma outra maneira de visualizar
a relação entre MainActivity
-
e as classes AppCompatActivity,
é desenhando um diagrama
-
com a hierarquia das classes.
-
É diferente de um diagrama
de hierarquia de views
-
porque esse mostra
uma árvore de views
-
que são mostradas na tela.
-
O diagrama de classes mostra a relação
entre as diferentes classes de Java.
-
Temos a AppCompatActivity
como uma superclasse.
-
Uma vez que a MainActivity estende
a partir da superclasse AppCompatActivity,
-
se denomina como subclasse.
-
Por isso, sempre que vir
esta definição de classe,
-
o que quer que você estenda
é conhecido como superclasse.
-
E esta seria a subclasse.
-
Assim, se criar outra atividade,
tal como a DetailActivity,
-
e estender a AppCompatActivity,
-
esta seria a subclasse
e esta a superclasse.
-
Vejamos outro exemplo
de herança de classes em Java.
-
Se pensar nisso, TextView,
ImageView e ButtonView,
-
todas contêm aspetos comuns.
-
Todas elas têm
uma largura e altura na tela.
-
Ainda não aprendemos isso,
mas também têm um estado de visibilidade.
-
De modo a poderem ser definidas
como visíveis ou invisíveis.
-
Existem outras propriedades também,
comuns entre elas.
-
Em vez de escrever o código
para estas propriedades
-
na classe TextView e depois
copiá-lo para as classes
-
ImageView e ButtonView,
podemos fazer algo mais inteligente.
-
Podemos criar uma classe View.
-
Podemos extrair as propriedades comuns
de todas estas vistas,
-
e depois colocá-las
dentro desta classe View.
-
Assim, o código
só tem de ser escrito uma vez.
-
Mas como fazemos a ligação
entre a classe TextView e a classe View?
-
Se está pensando em herança,
então você está certo.
-
No arquivo Java TextView
vamos definir uma classe TextView.
-
Assim, herdaremos o estado
e os métodos da classe View.
-
E assim, não teremos tanto código
na classe TextView
-
porque parte da funcionalidade
já se encontra escrita na classe View.
-
O mesmo se aplica para as classes
ImageView e ButtonView.
-
Não temos de escrever
todo esse código.
-
Nesses arquivos, só temos de escrever
o que é diferente na ImageView
-
quando comparada
com a classe View.
-
Eu vejo isto com especificar um Delta.
-
Assim, a classe ImageView
só tem de especificar
-
o que tem de diferente quando comparada
com a classe View.
-
Se não quisermos herdar alguns
dos comportamentos da classe View,
-
podemos simplesmente especificar
o novo comportamento da classe ImageView
-
ou de qualquer outra dessas classes.
-
E relembrando a terminologia,
aqui a TextView seria a subclasse
-
e View seria a superclasse.
-
Se voltarmos ao documento
relativo à lição sobre TextView,
-
já entenderemos esta parte.
-
Diz, TextView extends View.
-
Agora sabemos que significa que estamos
herdando estado e métodos da classe View.
-
E aqui temos um diagrama
com a hierarquia de classes.
-
Mostra que a classe TextView
está herdando da classe View.
-
E, por sua vez, a classe View
está herdando da classe Objeto.
-
Se continuar explorando,
encontrará outras classes.
-
Tal como a classe EditText,
que estende da classe TextView.
-
Por isso, herda o comportamento
da classe TextView, para além
-
de adicionar-lhe
outras funcionalidades.
-
Assim, EditText estende de TextView
e TextView estende de View
-
e View estende de Objet. E este
é o diagrama de hierarquia de classes.
-
Pode continuar a explorar
durante horas, mas primeiro
-
vou mostar algo da página
da documentação sobre o TextView.
-
Quero mostrar o método
para definir a visibilidade.
-
Aqui está o método Java para definir
visibilidade na classe TextView.
-
Isto permite alterar se a vista
fica visível ou não.
-
Se eu clicar nesse método,
ele me leva até à classe View.
-
E depois descreve
o que o método faz.
-
Pode ver que um objeto TextView
tem um método para definir a visibilidade
-
mas este foi herdado da classe View.
Por isso, obtemos esta funcionalidade
-
gratuitamente a partir da classe View.
-
Acabamos de ver uma série
de conceitos novos.
-
Geralmente, estes estariam distribuídos
ao longo de um semestre
-
de um curso de Ciências da Computação.
-
Vamos praticar um pouco
e eu espero que as coisas
-
comecem a ficar
mais claras para você.
-
Mas saiba que levará mais tempo
e prática até conseguir dominar
-
todos estes conceitos.
-
No primeiro exercício,
quero que você crie
-
um novo aplicativo para Android,
porque não queremos estragar
-
o aplicativo Just Java.
-
Depois de criar o projeto,
rode o aplicativo.
-
Depois de criar o aplicativo,
verá um arquivo MainActivity.
-
O arquivo MainActivity estenderá
a partir de AppCompatActivity.
-
Se na sua versão do Android Studio,
MainActivity estende de ActionBarActivity,
-
não há problema pois trata-se
apenas de uma versão mais antiga.
-
Ao remover este método Override,
vamos voltar para o modo
-
como o método OnCreate aparecia
na classe AppCompatActivity.
-
A presença deste método indica
que queremos um comportamento diferente
-
na MainActivity+ para o método Oncreate.
Por isso, ao removê-lo,
-
voltamos ao comportamento original
da classe AppCompatActivity.
-
Quando correr a aplicação,
quais as diferenças em comparação
-
com a primeira vez
em que correu a aplicação?
-
Escreva sua resposta nesta caixa.