Concrétiser un type de données abstrait

Fermé
drspinoza Messages postés 51 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 9 mai 2016 - 17 févr. 2016 à 20:50
 Utilisateur anonyme - 19 févr. 2016 à 21:37
Bonjour,

Je m'explique.
J'ai 2 classe et une interface.

Une classe Personne qui implemente une interface Individu et qui crée un objet de cette forme :
public class Personne implements Individu {
	
	private String nom;
	private ArrayList<String> prenoms;
	private Date dateNaissance;
	private int reference;
	private int parent1;
	private int parent2;
	
	public Personne(String nom, ArrayList<String> prenoms, Date date, int ref) {
		this.nom = nom;
		this.prenoms = prenoms;
		this.dateNaissance = date;
		this.reference = ref;
		this.parent1 = -1;
		this.parent2 = -1;
	}

	public Personne(String nom, ArrayList<String> prenoms, Date date) {
		this(nom, prenoms, date, -1);
	}
	

	@Override
	public void definirParent1(int ref) {
		this.parent1 = ref;
	}

/*et d'autres methodes getter et setter




J'ai ensuite une interface Genealogie.
Il s'agit d'une interface qu'on me demande d'implanter.
En résumer elle permet de lier les objets entre eux ( Parents , Frere, Enfants ... )

public interface Genealogie<U extends Individu> {
		
	/**
	 * @param mo, un individu
	 * @return, retourne la liste des deux individus parents, cette liste peut comporter
	 * des éléments nuls si les parents correspondants ne sont pas connus
	 */
	public ArrayList<U> lesParents(U moi);
	
	/**
	 * @param moi, un individu
	 * @return, retourne la liste des individus en age décroissant, qui ont les mêmes parents que moi,
	 * moi ne figure pas dans cette liste
	 */
	public ArrayList<U> laFratrie(U moi);
	/**
	 * @param p1, le premier parent
	 * @param pi2, le second parent
	 * @return retourne la liste des enfants de ces parents en age décroissant, si l'un des parents est null
	 * on retourne la liste des enfants de l'autre parent
	 */
	public ArrayList<U> lesEnfants(U p1, U p2);
	/**
	 * @param moi, un individu
	 * @param parent1, un individu, premier parent de moi
	 */
	public void definirParent1(U moi, U parent1);
	
	/**
	 * @param moi, un individu
	 * @param parent2, un individu second parent de moi
	 */
	public void definirParent2(U moi, U parent2);
	
}


C'est maintenant que j'ai besoin de votre aide il faut que je crée une classe qui implémente Genealogie et qui est de cette forme :


public class Gen <U extends Individu> implements Genealogie<U> {
	
  private ArrayList<U> Liste;
	
	public Gen(){
		Liste = new ArrayList<U>();
	}
		

	public int nombreIndividus() {
	  return Liste.size();
	}


	public ArrayList<U> lesIndividus() {
		return Liste;
	}


	public U lIndividu(int pos) {
		return Liste.get(pos);
	}

	public ArrayList<U> lesParents(U moi) {}

	public ArrayList<U> laFratrie(U moi) {}

	public ArrayList<U> lesEnfants(U p1, U p2) {}

	public void ajout(U moi) {
		Liste.add (moi);		
	}

	public void definirParent1(U moi, U parent1) {}

	public void definirParent2(U moi, U parent2) {}


}



Le problème et que je n'arrive pas à créer un objet Personne et ensuite le modifier et l'utiliser.
J'aimerai mieu comprendre la façon dont je doit procéder pour pouvoir répondre à ce test par exemple.

Voici une partie du test que je tente de valider :

public class TestGenealogie {
	private Personne p1;
	private Personne p2;
	private Personne p3;
	private Personne p4;
	private Personne p5;

	public void setUp() throws Exception {
		ArrayList<String> prenoms = new ArrayList<String>();
		DateFormat dfm = new SimpleDateFormat("Y");
		dfm.setTimeZone(TimeZone.getTimeZone("Canada/Montreal"));
		try {
			p1 = new Personne("e1",null, dfm.parse("1990"));
			p2 = new Personne("e2",null, dfm.parse("1994"));
			p3 = new Personne("p1",null, dfm.parse("1970"));
			p4 = new Personne("p2",null, dfm.parse("1972"));
			prenoms.add("pr1");
			prenoms.add("pr2");
			p5 = new Personne("gp1",prenoms, dfm.parse("1945"));
		} catch (ParseException e) {
			e.printStackTrace();
		}

	@Test
	public void testDefinirParent1() {
		Gen<Personne> g = new Gen<Personne>();
		g.ajout(p1);
		g.ajout(p2);
		g.ajout(p3);
		g.definirParent1(p1, p3);
		ArrayList<Personne> e = new ArrayList<Personne>();
		e.add(p1);
		assertEquals(e, g.lesEnfants(p3, null));
		assertEquals(e, g.lesEnfants(null, p3));
	}


	@Test
	public void testLesParents() {
		Gen<Personne> g = new Gen<Personne>();
		g.ajout(p1);
		g.ajout(p2);
		g.ajout(p3);
		g.ajout(p4);
		ArrayList<Personne> e = new ArrayList<Personne>();
		e.add(null);
		e.add(null);
		assertEquals(e, g.lesParents(p1));
		e = new ArrayList<Personne>();
		e.add(p3);
		e.add(null);
		g.definirParent1(p1, p3);
		assertEquals(e,g.lesParents(p1));
		e = new ArrayList<Personne>();
		e.add(null);
		e.add(p4);
		g.definirParent2(p2,p4);
		assertEquals(e,g.lesParents(p2));
		e = new ArrayList<Personne>();
		g.definirParent2(p1, p4);
		e = new ArrayList<Personne>();
		e.add(p3);
		e.add(p4);
		assertEquals(e, g.lesParents(p1));
	}

	@Test
	public void testLaFratrie() {
		Gen<Personne> g = new Gen<Personne>();
		g.ajout(p1);
		g.ajout(p2);
		g.ajout(p3);
		g.definirParent1(p1, p3);
		g.definirParent2(p1, p4);
		ArrayList<Individu> e = new ArrayList<Individu>();
		assertEquals(e,g.laFratrie(p1));
		g.definirParent1(p2, p3);
		g.definirParent2(p2, p4);
		e.add(p1);
		assertEquals(e,g.laFratrie(p2));		
		e = new ArrayList<Individu>();
		g = new Gen<Personne>();
		g.ajout(p1);
		g.ajout(p2);
		g.ajout(p3);
		g.ajout(p4);
		g.definirParent1(p1, p3);
		g.definirParent2(p1, p4);
		g.definirParent1(p2, p3);
		g.definirParent2(p2, null);
		assertEquals(e,g.laFratrie(p1));
		e = new ArrayList<Individu>();
		g = new Gen<Personne>();
		g.ajout(p1);
		g.ajout(p2);
		g.ajout(p3);
		g.ajout(p4);
		g.definirParent2(p1, p4);
		g.definirParent1(p2, p4);
		g.definirParent1(p1, null);
		g.definirParent2(p2, null);
		e.add(p1);
		assertEquals(e,g.laFratrie(p2));
	}


}


Toute aide est la bienvenue cela fait plusieurs jour que je suis bloqué.
Je sais que ma question est longue, juste un petit indice ou guide m'aiderai fortement.

Merci,

1 réponse

Utilisateur anonyme
18 févr. 2016 à 19:20
Salut,

Je comprends, tu peux très bien instancier une variable de type Personne et, grâce aux setter et getter, modifier ses champs ? Où est le problème ?
0
drspinoza Messages postés 51 Date d'inscription dimanche 25 octobre 2015 Statut Membre Dernière intervention 9 mai 2016
Modifié par drspinoza le 18/02/2016 à 19:36
C'est ce que j'ai fait mais ça ne fonctionne pas.
Je sais pas si c'est à cause de la genericité mais quand j'utilise les méthodes setter d'un objet Personne on dirait que ceului-ci devient vide et n'est plus utilisable dans mes boucles.

Par exemple voila ce que j'ai fait pour definirParent1:
public class Gen <U extends Individu> implements Genealogie<U> {

 private ArrayList<U> Liste;
  
public Gen() {
   Liste=new ArrayList<U>();
}
 
public void definirParent1(U moi, U parent1) {
  try{
      moi.definirParent1(Liste.indexOf(parent1));
  }catch(NullPointerException e){}
}
0
Individu ressemble à quoi en terme de code ? (c'est bien une interface ?)
0