public class exercice3 {

	/** Implemente un moteur.*/
	static public class moteur {

		private int nb_temps_moteur;
		private int contenance_reservoir;

		/** Constructeur de la classe moteur.*/
		public moteur(int nb_temps_moteur,int contenance_reservoir){

		this.nb_temps_moteur=nb_temps_moteur;
		this.contenance_reservoir=contenance_reservoir;
		}

		/** Renvoie le nombre de temps d'un moteur.*/
		public int getNb_temps_moteur(){

		return this.nb_temps_moteur;
		}

		/** Renvoie la contenance du reservoir d'un moteur.*/
		public int getContenance_reservoir(){

		return this.contenance_reservoir;
		}

		/** Affiche les informations concernant un moteur.*/
		public void afficherMoteur(){

		System.out.println("Moteur a "+this.nb_temps_moteur+" temps avec reservoir de "+this.contenance_reservoir+" litres.");
		}

	}

	/** Implemente un vehicule.*/
	static public class vehicule{

		private int nb_roues;
		private int nb_passagers;

		/** Constructeur de la classe vehicule.*/
		public vehicule(int nb_roues, int nb_passagers) {

		this.nb_roues=nb_roues;
		this.nb_passagers=nb_passagers;
		}

		/** Renvoie le nombre de roues du vehicule.*/
		public int getNb_roues(){

		return this.nb_roues;
		}

		/** Renvoie le nombre de passagers du vehicule.*/
		public int getNb_passagers(){

		return this.nb_passagers;
		}

		/** Affiche les informations concernant le vehicule.*/
		public void afficher(){

		System.out.println("Vehicule a "+this.nb_roues+" roues et pouvant accueillir "+this.nb_passagers+" personnes.");
		}

	}

	/** Implemente un vehicule a moteur*/
	static public class vehicule_motorise extends vehicule{

		private moteur moteur;

		/** Constructeur de la classe vehicule_motorise.*/
		public vehicule_motorise(int nb_roues, int nb_passagers, int nb_temps_moteur, int contenance_reservoir) {

		super(nb_roues,nb_passagers);
		this.moteur = new moteur(nb_temps_moteur,contenance_reservoir);
		}

		/** Renvoie le moteur d'un vehicule motorise.*/
		public moteur getMoteur(){

		return this.moteur;
		}

		/** Affiche les informations concernant le vehicule motorise.*/
		public void afficher(){

		System.out.println("Vehicule motorise a "+this.getNb_roues()+" roues, pouvant accueillir "+this.getNb_passagers()+" personnes, avec un moteur a "+this.moteur.getNb_temps_moteur()+" temps et un reservoir de "+this.moteur.getContenance_reservoir()+" litres.");
		}

	}

	/** Implemente une mobilette*/
	static public class mobilette extends vehicule_motorise{

		/** Constructeur de la classe mobilette.*/
		public mobilette() {

		super(2,1,2,15);
		}

		/** Affiche les informations concernant la mobilette.*/
		public void afficher(){

		System.out.println("Vehicule motorise a "+this.getNb_roues()+" roues, pouvant accueillir "+this.getNb_passagers()+" personnes, avec un moteur a "+this.getMoteur().getNb_temps_moteur()+" temps et un reservoir de "+this.getMoteur().getContenance_reservoir()+" litres.");
		}

	}


	/** Implemente un kart.*/
	static public class kart extends vehicule_motorise{

		/** Constructeur de la classe kart.*/
		public kart(int nb_temps_moteur) {

		super(2,1,nb_temps_moteur,5);
		}

		/** Affiche les informations concernant le kart.*/
		public void afficher(){

		System.out.println("Vehicule motorise a "+this.getNb_roues()+" roues, pouvant accueillir "+this.getNb_passagers()+" personnes, avec un moteur a "+this.getMoteur().getNb_temps_moteur()+" temps et un reservoir de "+this.getMoteur().getContenance_reservoir()+" litres.");
		}

	}

	
	/** Implemente des vehicule de transport.*/
	static public class vehicule_transport extends vehicule_motorise{

		private int capacite_coffre;

		/** Constructeur de la classe vehicule_transport.*/
		public vehicule_transport(int nb_roues, int nb_passagers, int nb_temps_moteur, int contenance_reservoir, int capacite_coffre) {

		super(nb_roues,nb_passagers,nb_temps_moteur,contenance_reservoir);
		this.capacite_coffre=capacite_coffre;
		}

		/** Renvoie la capacite du coffre.*/
		public int getCapacite_coffre(){
		
		return this.capacite_coffre;
		}

		/** Affiche les informations concernant le vehicule de transport.*/
		public void afficher(){

		System.out.println("Vehicule motorise a "+this.getNb_roues()+" roues, pouvant accueillir "+this.getNb_passagers() +" personnes, avec un moteur a "+this.getMoteur().getNb_temps_moteur()+" temps et un reservoir de "+this.getMoteur().getContenance_reservoir()+" litres, et un coffre de "+this.getCapacite_coffre()+" litres.");
		}

	}

	/** Implemente des voitures.*/
	static public class voiture extends vehicule_transport{


		/** Constructeur de la classe voiture.*/
		public voiture() {

		super(4,5,4,50,600);
		}

	}

	/** Implemente des fourgonettes.*/
	static public class fourgonette extends vehicule_transport{


		/** Constructeur de la classe fourgonette.*/
		public fourgonette() {

		super(4,3,4,100,5000);
		}

	}

	/** Implemente des camions.*/
	static public class camion extends vehicule_transport{


		/** Constructeur de la classe camion.*/
		public camion() {

		super(8,3,4,200,50000);
		}

	}


	/** Implemente des vehicules non motorises.*/
	static public class vehicule_propre extends vehicule{


		/** Constructeur de la classe vehicule_propre. On sait que les vehicules de cette classe ne peuvent prendre qu'un passager, donc on ne specifie que le nombre de roues.*/
		public vehicule_propre(int nb_roues) {

		super(nb_roues,1);
		}

		/** Affiche les informations d'un vehicule propre.*/
		public void afficher(){

		System.out.println("Vehicule non motorise a "+this.getNb_roues()+" roues, pouvant accueillir "+this.getNb_passagers()+" personne.");
		}

	}


	/** Implemente un velo.*/
	static public class velo extends vehicule_propre{
 
		private int capacite_coffre=20;

		/** COnstructeur de la classe velo.*/
		public velo(){
	
		super(2);
		}
	
		/** Renvoie la capacite du coffre */
		public int getCapacite_coffre() {

		return this.capacite_coffre;
		}

		/** Affiche les informations concernant le velo. */
		public void afficher(){

		System.out.println("Vehicule non motorise a "+this.getNb_roues()+" roues, avec un coffre de "+this.capacite_coffre+" litres et pouvant accueillir "+this.getNb_passagers()+" personne.");
		}
	}

	/** Implemente une trotinette.*/
	static public class trotinette extends vehicule_propre{

		/** Constructeur de la classe trotinette.*/
		public trotinette(){

		super(2);
		}
	}


	/** Implemente des rollers.*/
	static public class roller extends vehicule_propre{

		/** Constructeur de la classe roller.*/
		public roller(){

		super(8);
		}
	}



	public static void main(String args[]){
	   
	trotinette trotinette = new trotinette();
	System.out.println("\nTrotinette : ");
	trotinette.afficher();

	velo velo = new velo();
	System.out.println("\nVelo : ");
	velo.afficher();

	roller roller = new roller();
	System.out.println("\nRoller : ");
	roller.afficher();

	fourgonette fourgonette = new fourgonette();
	System.out.println("\nFourgonette : ");
	fourgonette.afficher();

	camion camion = new camion();
	System.out.println("\nCamion : ");
	camion.afficher();

	kart kart1 = new kart(2);
	System.out.println("\nKart seconde categorie : ");
	kart1.afficher();

	kart kart2 = new kart(4);
	System.out.println("\nKart premiere categorie : ");
	kart2.afficher();

	voiture voiture = new voiture();
	System.out.println("\nVoiture : ");
	voiture.afficher();

	}

}
