\documentclass[twoside,a4paper,10pt]{report}
\usepackage[french]{babel} %% Use your own babel language
\usepackage[top=3cm,bottom=3cm,left=2.5cm,right=2.5cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{pslatex}
\usepackage{hyperref}
\usepackage{graphicx}
\usepackage{tabularx}
\usepackage{supertabular}
\usepackage{pdflscape} %% Used for very big table
\usepackage{moreverb}
\usepackage{color}
\usepackage{listings}
\usepackage{lastpage}
\usepackage{fancyhdr}
\usepackage{ulem}
\usepackage{textcomp}
\usepackage{wasysym}
\usepackage{wrapfig} %%Usefull for image 
%%\usepackage{fguill} %%Use this package for guillemot[left|right] useless with babel set to french
\usepackage{eso-pic} %% Background
\pagestyle{fancy}%
\renewcommand{\headrulewidth}{0.1pt}
\renewcommand{\footrulewidth}{0pt}
\renewcommand{\chaptermark}[1]{%
	\markboth{\chaptername\ \thechapter.\ #1}{}}

\renewcommand{\sectionmark}[1]{%
	\markright{#1}{}}

\fancypagestyle{plain}{%
\fancyhf{}
\fancyfoot[R]{\thepage/\pageref{LastPage}}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}}
\fancyhf{}
\fancyhead[L]{\rightmark}
\fancyhead[R]{\leftmark}
\fancyfoot[R]{\thepage/\pageref{LastPage}}
\renewcommand{\headrulewidth}{0.1pt}
\renewcommand{\footrulewidth}{0pt}

\definecolor{codegray}{gray}{.95}
\lstset{language=C,
	numbers=left,
	tabsize=2,
	basicstyle=\scriptsize,
	stringstyle=\textrm,
	showstringspaces=false,
	frame=none,
	xleftmargin=3pt,
	backgroundcolor=\color{codegray}}

\newcommand{\settexitref}[2]{(\ref{#1}p\pageref{#1})}
\newcommand{\dokutitlelevelone}[1]{\chapter{#1}}
\newcommand{\dokutitleleveltwo}[1]{\section{#1}}
\newcommand{\dokutitleleveltree}[1]{\subsection{#1}}
\newcommand{\dokutitlelevelfour}[1]{\subsubsection{#1}}
\newcommand{\dokutitlelevelfive}[1]{\paragraph{#1}}
\newcommand{\dokufootnote}[1]{\footnote{#1}}
\newcommand{\dokufootmark}[1]{\footnotemark[#1]}
\newcommand{\dokubold}[1]{\textbf{#1}}
\newcommand{\dokuitalic}[1]{\textsl{#1}}
\newcommand{\dokumonospace}[1]{\texttt{#1}}
\newcommand{\dokuunderline}[1]{\underline{#1}}
\newcommand{\dokuoverline}[1]{\sout{#1}}
\newcommand{\dokusupscript}[1]{\textsuperscript{#1}}
\newcommand{\dokusubscript}[1]{$_{#1}$}
\newcommand{\dokuhline}{\line(1,0){400}}
\newcommand{\dokulabel}[1]{\label{#1}}
\newcommand{\dokuitem}{\item}
\newcommand{\dokuquoting}{\textbar}
\newcommand{\dokutabularwidth}{\textwidth}
\newcommand{\dokusupertabularheadbreak}{\small\sl continued from previous page}
\newcommand{\dokusupertabulartailbreak}{\small\sl continued on next page}
\newcommand{\dokuheadingstyle}[1]{\textbf{#1}}
\definecolor{dokuheadingcolor}{rgb}{0,0,0.60}
\newcommand{\dokubackground}[1]{%
\AddToShipoutPicture{%
  \AtTextCenter{%
    \makebox(0,0)[c]{\resizebox{\textwidth}{!}{%
      \rotatebox{25}{\textsf{\textbf{\textcolor[gray]{0.90}{#1}}}}}}%
  }%
 }%
}

\hypersetup{
pdftitle = {JAVA TP2},
pdfauthor = {E. Bruno},
pdfcreator = {DokuTeXit},
pdfproducer = {dokuwiki + TeXit + latex + dvipdf}
}
\title{JAVA TP2}
\author{E. Bruno}
\dokubackground{http://lsis.univ-tln.fr/\~{ }bruno/}
\begin{document}
\thispagestyle{empty}
\maketitle
\thispagestyle{empty}
\cleardoublepage
\tableofcontents
\newpage
\thispagestyle{plain}
\cleardoublepage
\newpage



\dokutitlelevelone{TP2 -  Héritage, polymorphisme et interfaces en Java}
\label{38fd5686c7a9588a43e1d01f2747f330}%% tp2_-_heritage_polymorphisme_et_interfaces_en_java
\label{98d648825b692edb5772da0b209b82a3}%%Start: tp2 => /home/bruno/public_html/data/pages/tp2.txt

\dokutitleleveltwo{Objectif}
\label{ba81ee9ceeb9c96227f3607460f09179}%% objectif
L'objectif ce TP est de présenter l'héritage, le polymorphisme et l'utilisation des interfaces en Java. Vous devez écrire la javadoc externalmedia http://java.sun.com/j2se/javadoc/writingdoccomments/\href{} au fur et à mesure de l'avancement et il est \dokubold{fortement} conseillé d'avoir le documentation de java sous les yeux : externalmedia http://java.sun.com/j2se/1.5.0/docs/api/index.html\href{}


\dokutitleleveltwo{Appel d'une méthode la classe mère}
\label{a8c413cea71c6288c7d30ab2e020f1c2}%% appel_d_une_methode_la_classe_mere
Dans cet exercice nous allons modéliser des \dokumonospace{plantes}, des \dokumonospace{animaux}, des \dokumonospace{mammifères} et des \dokumonospace{oiseaux} mais aussi des \dokumonospace{chiens}, des \dokumonospace{aigles}, des \dokumonospace{lapins} et des \dokumonospace{hommes}. 


\dokutitleleveltree{Modélisation par héritage et Instanciation}
\label{da0a05019460baf8bc13a0bddffc1351}%% modelisation_par_heritage_et_instanciation

\begin{itemize}
\dokuitem  Modélisez cette hiérarchie (directement en Java) avec des classes. Ajoutez à chaque classe fille au moins une variable et une méthode nouvelle selon votre imagination (âge, nom, sexe, \ldots{}).
\dokuitem  Ajoutez une classe exécutable \dokumonospace{Test} et créez des instances de chacune des classes. Affichez avec la méthode \dokumonospace{System.out.prinln()} chacun des objets. 
\dokuitem  Redéfinissez la méthode \dokumonospace{toString()} (héritée de \dokumonospace{Object}, voir dans la documentation) de la super classe pour qu'elle affiche "\dokumonospace{Je suis un animal}" (ou "\dokumonospace{Je suis une plante}"). Exécutez la classe \dokumonospace{Test}. Expliquer le résultat en étudiant la classe \dokumonospace{java.lang.System}.
\dokuitem  Modifiez la méthode précédente pour qu'elle affiche "\dokumonospace{Je suis un animal et mon identifiant est X}".
\end{itemize}

\dokutitleleveltree{Polymorphisme simple}
\label{ccd1cf7ac4f69f7f1f9502f653ce2ec4}%% polymorphisme_simple

\begin{itemize}
\dokuitem  Avec quels types de références pouvez-vous manipuler les classes précédentes ?
\dokuitem  Dans la méthode \dokumonospace{main} la classe \dokumonospace{Test}, créez des tableaux qui permettent de voir certains des animaux crées \dokubold{dans la section précédente} comme des collections (de taille fixe) d'animaux ou de mammifères.
\dokuitem  Ajouter à chaque classe une méthode \dokumonospace{String getInfo()} (qui appellera celle de la superclasse) pour que l'affichage du tableau suivant :
\end{itemize}

\lstset{language=java}
\begin{lstlisting}{new Animal(12), new Animal(), new Chien(5,"Médor"), new Homme(), new Homme(25,"Robert")}
\end{lstlisting}

soit de la forme :



\small
\begin{verbatimtab}

Je suis un animal âgé de 12 an(s).
Je suis un animal.
Je suis un animal âgé de 5 an(s). Je suis un mammifère. Je suis un chien de nom Médor.
Je suis un animal. Je suis un mammifère. Je suis un homme.
Je suis un animal âgé de 25 an(s). Je suis un mammifère. Je suis un homme de nom Robert.

\end{verbatimtab}
\normalsize

\dokutitleleveltree{Classes abstraites}
\label{629a08ca2023d9b7d992cea39d71f35b}%% classes_abstraites

\begin{itemize}
\dokuitem  Modifiez les classes pour s'assurer que tous les Animaux possèdent la méthode \dokumonospace{String moyenExpression} qui retourne une phrase du type "\dokumonospace{Je parle}", "\dokumonospace{J'aboie}", ou "\dokumonospace{Je fais des bulles}" (l'aigle trompette, glapit ou glatit ; le lapin clapit).
\dokuitem  Est-ce que le moyen d'expression peut être définit pour toutes les classes ? Peut-on alors créer une instance de la classe Animal, quelle est votre conclusion pour s'assurer de cela ? Faites de même pour toutes les classes pour les lesquelles cela vous semble nécessaire.
\dokuitem  Écrivez une méthode \dokumonospace{afficherAnimaux()} dans la classe \dokumonospace{Animal} qui prend en paramètre un tableau d'animaux et qui affiche leur référence et leur cri. Testez la sur le tableau de la question précédente.
\end{itemize}

\dokutitleleveltree{Administration de classe et polymorphisme}
\label{64cbdac9c3daaf9d802c8f9a8d2feece}%% administration_de_classe_et_polymorphisme

\begin{itemize}
\dokuitem  Modifiez vos classes pour que l'on garde automatiquement des références (dans un tableau) vers tous les animaux créés (Vous vérifierez aussi que l'on ne crée pas plus de \dokumonospace{NB{\textunderscore}MAX{\textunderscore}ANIMAUX}).
\dokuitem  Créez une méthode (de classe ou d'instance ?) qui affiche la description complète de tous les animaux crées.
\end{itemize}

\dokutitleleveltree{Héritage multiple et Interface}
\label{7a552e96a74581658b074c65a8ee6688}%% heritage_multiple_et_interface

\begin{itemize}
\dokuitem  On souhaite maintenant considérer que certains animaux (pas forcément tous) sont des carnivores (ils comportent la méthode \dokumonospace{void manger} avec comme paramètre un autre animal) ou des herbivores (ils comportent la méthode \dokumonospace{void manger} avec comme paramètre une plante) ou les deux. Créez deux interfaces pour décrire ces comportements
\dokuitem  Modifiez vos classes pour qu'elles implantent ces interfaces :
\begin{itemize}
\dokuitem  Les carnivores : quand ils mangent,  les chiens affichent "\dokumonospace{Je mord X}", et les aigles affichent "\dokumonospace{Je déchire X}".
\dokuitem  Les herbivores : les vaches affichent "\dokumonospace{Je broute X}", et les lapins "\dokumonospace{Je grignotte X}".
\end{itemize}

\dokuitem  Les hommes sont à les fois carnivores et herbivores, proposez deux solutions pour le représenter :
\begin{itemize}
\dokuitem  Dans un premier temps, sans créer de nouvelle interface.
\dokuitem  Dans un second temps en créant une nouvelle interface \dokumonospace{IOmnivore}.
\end{itemize}

\dokuitem  Le polymorphisme est aussi utilisable avec les interfaces :
\begin{itemize}
\dokuitem  Appliquez la méthode \dokumonospace{manger(unePlante} sur la \dokumonospace{Vache} que avez déjà créée en la voyant à travers une référence de type \dokumonospace{IHerbivore}. Peut-on appliquer la méthode \dokumonospace{moyenExpression()} sur cette référence ?
\end{itemize}

\dokuitem  Créez deux tableaux \dokumonospace{lesCarnivores' et }lesHerbivores'' pour manipuler les animaux existants. Créez un lapin, et faites le manger par tous les carnivores, créez une plante et faites la manger par les herbivores.
\end{itemize}

\dokutitleleveltwo{Si vous avez déjà fini\ldots{}}
\label{c07df7284d8ef80d45e0450363c656af}%% si_vous_avez_deja_fini

\begin{itemize}
\dokuitem  Vous pouvez construire depuis eclipse le diagramme UML correspondant à ce TP. Placez vous sur le répertoire du paquetage et et créer un nouveau diagramme de classe (bouton droit \ldots{}). Vous pouvez alors insérer les classes Java existantes.
\dokuitem  Vous pouvez alors ajouter des nouvelles classes ou modifier des classes existantes (le code Java est alors mis à jour). Ajoutez de nouveaux animaux (Poule, Tigre, \ldots{}).
\end{itemize}
\end{document}

