CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : Recuperer la classe d'un Objet Java

DébutPage précedente
1
Page suivantePage suivante
K-Tastrophe K-Tastrophe
MP
Niveau 10
19 décembre 2014 à 19:27:49

Bonsoir,

Je suis en train de faire un programme à propos d'un parking. Il y a deux type de place de parking(Particulier et Livraisons) et deux type de vehicule (voiture et camion). Les voitures peuvent se garer sur les deux type de place alors que les camions uniquement sur une place de livraisons. Mais j'ai un peu de mal à realiser cette condition. En effet, avant d'attribuer à vehicule à une place, j'aimerais tester si ce vehicule y est autorisé, mais je ne sais pas trop comment faire. Et je ne veux pas utilisé la methode instanceof().
J'avais pensé à rajouter un attribut aux classes Voiture et Camion du style "private String type" où je met "voiture" si je cree une voiture ou "camion" si je cree un camion. Mais je sais pas si c'est vraiment top top.

J'espère avoir été assez precis.
Merci :ange:

Pseudo supprimé
Niveau 10
19 décembre 2014 à 20:16:43

C'est "pire" que instanceof. Utilise la magie des interfaces et de la programmation objet. C'est fait exactement pour ça.

K-Tastrophe K-Tastrophe
MP
Niveau 10
19 décembre 2014 à 20:46:11

Comment on peut faire avec les interfaces ?
Car j'ai une classe abstraite Vehicule, une classe Voiture et Camion qui heritent tout deux de Vehicule, une classe abstraite Place, une classe Particulier et une classe Livraison qui heritent de Place. Mais je ne vois pas comment resoudre mon problème.

Hamsterloulo Hamsterloulo
MP
Niveau 9
19 décembre 2014 à 21:27:44

Tu peux utiliser la méthode .getClass()
Je crois

Pseudo supprimé
Niveau 8
19 décembre 2014 à 22:11:31

Tu connais le double dispatch ou le pattern visitor ? double dispatch en pseudo code

class Place
{
    garer(Vehicule v)
    {
        // demande au véhicule d'appeler sa méthode correspondante
        v.garer(this); 
    }

    garerVoiture(Voiture v)
    {
        //...
    }

    garerCamion(Camion c)
    {
        //...
    }
}

class Voiture
{
    garer(Place p)
    {
        p.garerVoiture(this);
    }
}

class Camion
{
    garer(Place p)
    {
        p.garerCamion(this);
    }
}

ainsi

Place p = new Livraison();
Vehicule va = new Voiture();
Vehicule vb = new Camion();

p.garer(va); // appelle va.garer() qui appelle p.garerVoiture()
p.garer(vb); // appelle vb.garer() qui appelle p.garerCamion()

K-Tastrophe K-Tastrophe
MP
Niveau 10
19 décembre 2014 à 23:00:44

Ah pas mal. Merci beaucoup :ange:

K-Tastrophe K-Tastrophe
MP
Niveau 10
19 décembre 2014 à 23:14:14

Desolé du double post mais j'ai une question. J'ai ces trois fonctions :
void garer(Vehicule V){...}
void garer(Voiture V){...}
void garer(Camion V){...}

Theoriquement, si je fais :
Vehicule V1 = new Voiture()
Vehicule V2 = new Camion()
V1.garer().
V2.garer()

Normalement, V1 appelle la deuxième methodes et V2 le troisième, non ?

Pseudo supprimé
Niveau 10
19 décembre 2014 à 23:26:36

elite_2009 :d) faut laisser les personnes chercher, tu apprends mieux lorsque tu fais la démarche par toi-même, la preuve, il a des difficultés à comprendre un truc qui lui est servi clés en mains :)

K-Tastrophe :d) La magie de ce système, c'est que c'est l'objet qui va dire à celui qui en a besoin que faire avec. Dans le cas présent, c'est la place qui demande à garer un véhicule comment se garer.


Interface Véhicule
méthode garer();

Classe Voiture implémente Véhicule
méthode garer(); vaut "Une voiture se gare sur une petite place"

Classe Camion implémente Véhicule
méthode garer(); vaut "Un camion se gare sur une grande place"

Classe Place
méthode garerVéhicule(Véhicule monVéhicule)
faire monVéhicule.garer();

Vehicule twingo = new Voiture();
Vehicule partner = new Camion();
Place unePlace = new Place();

unePlace.garer(partner);
unePlace.garer(twingo);

Ce qui offre l'avantage de ne pas avoir à intervenir sur la classe Place si tu implémente un nouveau Véhicule.

Pseudo supprimé
Niveau 8
19 décembre 2014 à 23:39:14

avec l'overloading, tu dois utiliser 2 interfaces, l'interface du visiteur et l'interface du visité.


interface GarerVisiteur {
	garer(GareVisite gv);
	garer(Voiture v);
	garer(Camion c);
}

interface GareVisite {
	garer(GarerVisiteur gv);
}

class Place implements GarerVisiteur {
	garer(GareVisite gv) {
		gv.garer(this);
	}
}

class Voiture implements GareVisite {
	garer(GarerVisiteur gv) {
		gv.garer(this);
	}
}

ainsi, le système de typage donne certaines garanties.

Pseudo supprimé
Niveau 10
19 décembre 2014 à 23:42:45

interface GarerVisiteur {
    garer(GareVisite gv);
    garer(Voiture v);
    garer(Camion c);
}

C'est cette partie que je n'aime pas trop, ça crée un couplage fort dans le code.

K-Tastrophe K-Tastrophe
MP
Niveau 10
19 décembre 2014 à 23:47:20

Je suis daccord. Mais j'ai deux type de place. SI j'utilise ton code et que je fais :

Vehicule twingo = new Voiture();
Vehicule partner = new Camion();
Place unePetitePlace = new PetitePlace();
Place uneGrandePlace = new GrandePlace();

unePetitePlace.garer(partner); 
uneGrandePlace.garer(partner);

Ca va me mettre le même resultat pour les deux garer(). Or justement, je ne veux pas que ca fasse la même chose. Mais si je fais :


unePetitePlace.garer(twingo)
uneGrandePlace.garer(twingo)

La je veux que ca fasse la même chose.

Pseudo supprimé
Niveau 10
19 décembre 2014 à 23:57:41

Non, tu as une interface "Place" et deux implémentations de celle-ci "GrandePlace" et "PetitePlace". C'est à la charge des véhicules de dire ce dont ils ont besoin, justement.

parking.garer(monVehicule)

monVehicule réclamera alors une place adaptée à son gabarit.

Tharsis Tharsis
MP
Niveau 10
20 décembre 2014 à 03:59:28

.class ça ne marche pas dans ce cas ?

K-Tastrophe K-Tastrophe
MP
Niveau 10
20 décembre 2014 à 16:39:26

Desolé mais je n'arrive toujours pas à comprendre comment faire :( . Au debut, j'avais ca :
interface Place { public Vehicule garer(Vehicule V); } class PetitePlace{ private Vehicule vehiculegarer; public Vehicule garerVehicule(Vehicule V){ this.vehiculegarer=V; } } class GrandePlace{ private Vehicule vehiculegarer; public Vehicule garerVehicule(Vehicule V){ this.vehiculegarer=V; } } abstract class Vehicule{ private String immatriculation; private String proprietaire; } class Voiture { //Constructeur Voiture; } class Camion { //Constructeur Camion; }

Donc j'avais ca avant. Après, j'ai essayé comme vous m'avez dit de mettre une fonction garer dans les classes Voiture et Camion et d'appeller cette fonction dans la fonction garerVehicule. Mais je reviens toujours à mon problème : comment agir differement si j'appelle la fonction garer de vehicule dans la classe PetitePlace et dans la classe GrandePLace ?

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment