%cabeçalho para todos os capítulos
%\input{cabecalho}

%\begin{document}

%Opções para o pacote listings
%\input{listingOptions}

\chapter{Herança}

\begin{center}
\shabox{
  \begin{Bitemize}
    \item[]\textbf{Quais novidades veremos nesta aula?}
    \item Herança
  \end{Bitemize}
} % \shabox
\end{center}
\bigskip


\section{O Conceito de Herança}

A demanda pela construção de software em nossa sociedade é muito grande.
O número de bons programadores disponíveis é relativamente pequeno. Por
isso, os projetistas de linguagens e sistemas de computação têm buscado
formas de acelerar e facilitar o desenvolvimento de software. Uma das
principais abordagens utilizadas é a re-utilização de código. Se
conseguirmos escrever código que é re-utilizado em diversos programas
diferentes, teremos economizado tempo pois não será necessário
reescrever este código para cada novo programa.

A biblioteca de classes de Java é um exemplo de classes que foram
escritas pelos programadores da Sun e que são re-utilizadas diariamente
por milhares de programadores ao redor do mundo. Porém, algumas vezes, o
programador necessita fazer alguma modificação em uma classe existente
pois ela não atende exatamente às necessidades de um dado programa. Em
alguns casos deseja-se modificar a implementação de um de seus métodos,
em outros casos deseja-se acrescentar alguma funcionalidade extra à
classe, acrescentando-se alguns métodos e atributos adicionais.

Esta re-utilização de código com extensões e modificações, pode ser
obtida em linguagens orientadas a objetos através do conceito de
Herança. A figura \ref{fig:herança} mostra um diagrama contendo 4 classes que se
relacionam entre si através de herança.

%\bigskip
\begin{figure}[ht]
\begin{center}
\includegraphics[%
  clip,
  width=5cm,
  angle=0]{images/heranca1.png}
\caption{\label{fig:herança}Diagrama de herança}
\end{center}
\end{figure}

Este diagrama de classes segue um padrão chamado UML (\emph{Unified Modeling
Language}). Este padrão é muito utilizado para modelar programas
orientados a objetos, mas não veremos mais detalhes sobre ele neste livro. Apresentamos
o diagrama aqui apenas a título de ilustração.

\section{Terminologia de herança}

\begin{itemize}
\item Dizemos que \texttt{Pessoa} é a \textbf{\emph{superclasse}} de
      \texttt{Aluno} e de \texttt{Professor}.
\item \texttt{Professor} é \textbf{\emph{subclasse}} de \texttt{Pessoa}
      e \textbf{\emph{superclasse}} de \texttt{ProfessorDoutor}.
\item Dizemos ainda que \texttt{Aluno} \textbf{\emph{herda}} de \texttt{Pessoa}
      os seus atributos e métodos; ou que \texttt{Aluno} \textbf{\emph{estende}}
      a class \texttt{Pessoa}.
\item Dizemos que \texttt{Pessoa} é \textbf{\emph{pai}} (ou \textbf{\emph{mãe}} )
      de \texttt{Professor}; e que \texttt{Professor} é \textbf{\emph{filho}} (a)
      de \texttt{Pessoa}.
\end{itemize}

\section{Implementação de herança na linguagem Java}

Para especificar, em Java, que uma classe B é subclasse de A, utilizamos
a palavra \texttt{extends}:

\begin{lstlisting}
class A
{
  int a1;
  void pata (){ a1 = 1; }
}

class B extends A
{
  int b1;
  void vina ()
  {
    pata ();
    b1 = a1;
  }
}
\end{lstlisting}

Note que \texttt{B} contém os métodos e atributos de \texttt{A} e ainda acrescenta um novo
atributo e um novo método.

Vejamos agora um exemplo mais complexo que implementa, em Java, o
diagrama de classes apresentado no diagrama UML acima.

\begin{lstlisting}
class Pessoa
{
   private String nome;
   private char sexo;
   private String CPF;
   private String RG;
   private int anoDeNascimento;
   void imprimeDados ()
   {
     if (sexo == 'F')
       System.out.println ("A Sra. " + nome + "nasceu no ano" +
anoDeNascimento +
                            ". CPF: " + CPF + ", RG " + RG);
     else
       System.out.println ("O Sr. " + nome + "nasceu no ano" +
anoDeNascimento +
                            ". CPF: " + CPF + ", RG " + RG);
   }
}

class Aluno extends Pessoa
{
   private String curso;
   private int anoDeIngresso;
   void imprimeDados ()
   {
    super.imprimeDados ();
    System.out.println ("Ingressou no curso " + curso + " em " +
anoDeIngresso);
   }
}

class Professor extends Pessoa
{
   private String departamento;
   private int anoDeAdmissão;
   void imprimeDados ()
   {
    super.imprimeDados ();
    System.out.println ("Ingressou no dept. " + departamento + " em " +
anoDeAdmissão);
   }
}

class ProfessorDoutor extends Professor
{
   private int anoDeObtençãoDoutorado;
   private String instituiçãoDoDoutorado;
   void imprimeDados ()
   {
    super.imprimeDados ();
    System.out.println ("Doutorado obtido em " +  instituiçãoDoDoutorado
                        + " em " + anoDeObtençãoDoutorado);
   }
}
\end{lstlisting}

Um banco de dados da universidade pode armazenar objetos do tipo \texttt{Pessoa}
da seguinte forma:

\begin{lstlisting}
class ListaDePessoasDaUSP
{
   Pessoa [] membrosDaUSP;

   ListaDePessoasDaUSP (int tamanho)
   {
      membrosDaUSP = new Pessoa [tamanho];
   }

   // métodos para acrescentar e remover pessoas da lista de pessoas

   void listaTodos ()
   {
     int i;
     for (i = 0; i < membrosDaUSP.length; i++)
        membrosDaUSP[i].imprimeDados ();
   }

    // demais métodos...
}
\end{lstlisting}

Note que para o método \texttt{listaTodos}, não interessa qual o tipo específico
de cada pessoa (aluno, professor, professor doutor) uma vez que ele
manipula apenas os atributos da superclasse \texttt{Pessoa}.


\section{Hierarquia de Classes}

Quando um programa possui uma série de classes relacionadas através de
herança, dizemos que temos uma \emph{hierarquia de classes}.

Apresentamos na figura \ref{fig:herança2} uma hierarquia de classes para representar os diversos
tipos de seres vivos.

%\bigskip
\begin{figure}[ht!]
\begin{center}
\includegraphics[%
  clip,
  width=10cm,
  angle=0]{images/heranca2.png}
\caption{\label{fig:herança2}Hierarquia de classes representando os seres vivos}
\end{center}
\end{figure}

\section{Relacionamento ``é um''}

Nem sempre é fácil determinarmos qual hierarquia de classes devemos
utilizar. A relação superclasse-subclasse deve necessariamente ser um
relacionamento do tipo "é um", ou seja se \texttt{B} é subclasse de \texttt{A} então todo
\texttt{B} é um \texttt{A}.

Em termos mais concretos, no exemplo dos seres vivos, \texttt{Animal} é um \texttt{SerVivo}, e
mais, todo animal é um ser vivo. Não existe nenhum animal que não seja um ser vivo. Então o
relacionamento superclasse-subclasse pode ser apropriado.

Outra possibilidade seria ter uma hierarquia como a seguinte:

%\bigskip
\begin{figure}[ht]
\begin{center}
\includegraphics[%
  clip,
  width=1.5cm,
  angle=0]{images/heranca3.png}
\caption{\label{fig:herança3}Hierarquia errada}
\end{center}
\end{figure}

A principio, esta pode parecer uma hierarquia aceitável. Mas na verdade
ela está ERRADA. Não podemos dizer que "um reino é um ser vivo", não faz
sentido, não podemos dizer que "um filo é um reino" porque não é. Então
a hierarquia não está boa.

\section{Resumo}

\begin{itemize}
\item uma classe pode herdar de outra seus atributos e métodos
\item uma subclasse pode estender a funcionalidade de sua superclasse
      acrescentando novos atributos e métodos
\end{itemize}

Mas, e se uma subclasse implementar um método com assinatura idêntica a
um método da superclasse? Neste caso, quem prevalece é o método da
subclasse e dizemos que o método da subclasse \textbf{\emph{se sobrepõe
("overrides")}} ao método da superclasse.

\section{Exercícios}

\begin{enumerate}
\item Retornando à hierarquia de classes apresentada na figura
  \ref{fig:herança2}, pense em quais métodos e atributos deveriam estar
  presentes nas classes superiores da hierarquia e quais deveriam estar nas
  partes inferiores da hierarquia.
\item Desenvolva um conjunto de classes para controlar o saldo, depósitos e
  retiradas de contas bancárias bem como os dados do titular. Escreva
  inicialmente um diagrama modelando tanto contas corrente quanto contas
  poupança e aplicações em fundo. Em seguida, implemente estas classes em Java.
\end{enumerate}

%\end{document}
