4 votes

Java - tableau d'objets différents qui ont la ou les mêmes méthodes.

Je pratique l'héritage.

J'ai deux classes similaires que j'aimerais assimiler en un seul tableau, j'ai donc pensé à utiliser la classe Object comme superclasse puisque tout est une sous-case d'Object.

Ainsi, par exemple, je place la classe T et la classe CT dans un tableau appelé all comme suit :

 Object all[] = new Object[6];

    all[0] = T1;

    all[1] = CT2;

    all[2] =T3;

    all[3] = CT1;

    all[4] = T2;

    all[5] = CT3;

J'ai sauté les déclarations car ce n'est pas mon problème.

Mon vrai problème est que je souhaite appeler une fonction dans le tableau en utilisant une boucle :

for (int i = 0; i < 6; i++) {

    all[i].beingShot(randomNum, randomNum, AK47.getAccuracy());
}

Les classes concernées par T et CT respectivement ont toutes deux la méthode beingShot, qui est publique.

Eclipse conseille de les couler comme une solution rapide. Je me demande s'il existe une alternative logique autre que la création de ma propre classe Object qui contient la méthode beingShot, ou l'ajout de cette méthode à la classe Object, bien que je pense que l'un ou l'autre de ces choix causerait plus de problèmes à long terme.

Merci !

13voto

jahroy Points 10072

Si les deux classes implémentent la ou les mêmes méthodes, vous devez envisager de créer une classe de type interface .

Les interfaces sont très puissantes et faciles à utiliser.

Vous pourriez appeler votre interface Shootable .

Vous pouvez créer un tableau d'objets différents qui mettent en œuvre la fonction Tirable et les traiter tous de la même façon.

// Define a VERY simple interface with one method.

interface Shootable {
    public void beingShot();
}

// Any class that implements this interface can be treated interchangeably

class Revolver implements Shootable {
    public void beingShot() {
        System.out.println("Revolver: firing 1 round");
}

class MachineGun implements Shootable {
    public void beingShot() {
        System.out.println("Machine Gun: firing 50 rounds");
    }
}

class HockeyPuck implements Shootable {
    public void beingShot() {
        System.out.println("Hockey Puck: 80 MPH slapshot");
    }
}

class RayBourquePuck implements Shootable {
    public void beingShot() {
        System.out.println("Hockey Puck: 110 MPH slapshot");
    }
}

class OunceOfWhiskey implements Shootable {
    public void beingShot() {
        System.out.println("Whiskey Shot: 1 oz down the hatch...");
    }
}

// You can declare an array of objects that implement Shootable

Shootable[] shooters = new Shootable[4];

// You can store any Shootable object in your array:

shooters[0] = new MachineGun();
shooters[1] = new Revolver();
shooters[2] = new HockeyPuck();
shooters[3] = new OunceOfWhiskey();

// A Shootable object can reference any item from the array

Shootable anyShootableItem;

// The same object can to refer to a MachineGun OR a HockeyPuck

anyShootableItem = shooters[0];
anyShootableItem.beingShot();

anyShootableItem = shooters[2];
anyShootableItem.beingShot();

// You can call beingShot on any item from the array without casting

shooters[0].beingShot();
shooters[1].beingShot();

// Let's shoot each object for fun:

for (Shootable s : shooters) {
    s.beingShot();
}

Voici un excellente question et réponse à ce sujet .

1voto

sashkello Points 15181

Object n'a pas la méthode beingShot. Si tous les objets du tableau sont de la même classe, alors votre tableau devrait être de la même classe. Sinon, ils doivent tous avoir la même interface implémentée ou étendre la même classe. Je ne vois pas pourquoi vous voudriez explicitement étendre Object ici, cela n'ajoute aucune fonctionnalité.

1voto

Rohit Jain Points 90368

Vous devez faire un casting pour votre object références à la classe appropriée pour appeler leur méthode

Pour chaque référence que vous récupérez de votre array vous devez vérifier en utilisant instanceof dont est l'instance à laquelle se réfère votre référence d'objet . En conséquence, vous pouvez faire un typcast de la référence à cette classe

Mais le Typecasting est une chose laide Vous devez l'éviter autant que possible Si vous devez choisir la méthode à invoquer en fonction de la sous-classe exacte, vous devriez probablement choisir une méthode de type Interface .. C'est le meilleur moyen d'obtenir ce que vous voulez ici...

Et je pense que vous avez obtenu suffisamment d'informations sur la façon de le mettre en œuvre

0voto

Vin.X Points 776

Vous ne pouvez pas le faire... puisque Java ne supporte pas la méthode d'extension. (C# le fait)

LIRE LE LIEN CI-DESSOUS :

L'équivalent Java des méthodes d'extension C#

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X