package fr.eisti.transport;

public abstract class Vehicule {
	private String modele;
	private String marque;
	
	public Vehicule(String marque, String modele) {
		// vérification non demandée sur les paramètres de constructions
		// => permet de ne pas faire les vérifications dans les méthodes
		// de cette classe quand on utilise ces attributs 
		if ((marque == null) || (modele == null)) {
			throw new NullPointerException("Un véhicule doit avoir une marque et un modèle");
		}
		this.modele = modele;
		this.marque = marque;
	}
	
	public String getModele() {
		return modele;
	}
	
	public String getMarque() {
		return marque;
	}

	// Redefinition de la méthode de la classe Object
	@Override
	public String toString() {
		return marque + " " + modele;
	}
	
	// Redefinition de la méthode de la classe Object
	@Override
	public boolean equals(Object o) {
		if ((o == null) || (!(o instanceof Voiture))) {
			return false;
		}
		Voiture v = (Voiture) o;
		return this.getMarque().equals(v.getMarque())
				&& this.getModele().equals(v.getModele());
		// Rappel : pour voir si 2 objets sont égaux on utilise equals
		// 			pour 2 valeurs primitives ==
		//			pour 2 valeurs d'une énumération equals ou ==
	}
	
	// Redefinition de la méthode de la classe Object
	// NB : 2 objets égaux doivent avoir même hashCode
	@Override
	public int hashCode() {
		return getMarque().hashCode()
			+ getModele().hashCode();
		
	}
	
	// méthode abstraite à redéfinir pour déplacer le véhicule
	public abstract void deplacer();
	
}