2011-10-09 2 views
1

J'essaye d'écrire un programme de simulation de conduite et j'ai besoin d'aide pour la conception. J'ai une interface appelée RoadObjects qui contient pour l'instant des véhicules et des mammifères. J'ai besoin de mettre en place différents types de voitures comme des camions, des berlines, des semi-remorques. ils ont des méthodes en commun et d'autres uniques. Plus tard, j'ajouterai d'autres types de véhicules et de mammifères. Je ne veux pas utiliser l'héritage et j'essaye de le faire selon des principes de conception et des modèles tels que le principe ouvert-fermé et l'usine. Maintenant, ma question est, dois-je concevoir comme ceci:Implémentation d'une classe en Java

RoadObject interface 

Vehicle extends RoadObject 

Mammal extends RoadObject 

SedanImpl implements Vehicle 

TruckImpl implements Vehicle 

People implements Mammal 

...

...

ou devrais-je avoir tout simplement pas véhicule et les gens interface et faire cela?

RoadObject interface 

SedanImpl implements RoadObject 

TruckImpl implements RoadObject 

People implements RoadObject 

Nouvelle question: Je veux utiliser un modèle d'usine, de choisir quel type de véhicules par exemple. Je fais donc un VechicleImpl et VechicleImplFactory il pourrait ressembler à ceci:

RoadObject interface 

Vehicle extends RoadObject 

VehicleImpl implements Vehicle 

Mammal extends RoadObject 

SedanImpl implements Vehicle 

TruckImpl implements Vehicle 

People implements Mammal 

Est-ce ce genre de mauvaise conception? Parce que VehicleImpl aura beaucoup de méthodes en double de SedanImpl, TruckImpl etc. Ou si je voulais avoir une usine qui crée un véhicule, où cela devrait-il être?

+0

Modélisation des classes supplémentaires pour les '' Truck' et Sedan' peut ne pas être nécessaire à tous, donc avoir un 'VehicleImpl' peut remplir toutes vos exigences si vous pouvez mapper les informations requises pour' Truck' et 'Sedan' à votre' VehicleImpl'. – home

+0

@home, mais theres la question des méthodes qui sont uniques au camion et à la berline – Dan

+0

Vraiment, dites-moi :-) – home

Répondre

0

Les deux approches sont valides, si vous avez besoin d'une abstraction explicite pour les véhicules dépend de vos besoins. SedanImpl, TruckImpl etc., peuvent partager certaines caractéristiques communes aux véhicules, mais pas à Humen/animaux:

public interface Vehcile extends RoadObject 
    getTires() 
    getEngine() 

Comme vous avez marqué ce en Java abstract communs classes peuvent être utiles aussi bien:

public abstract class AbstractVehicle implements Vehicle { 
    private Integer tires = 4; 

    public Integer getTires() { return this.tires; } 

    /* ... */ 
} 

Alors que TruckImpl peut hériter de AbstractVehicle:

public class TruckImpl extends AbstractVehicle { 
    /* ... */ 
} 
0

Quelque chose raisonnable:

- public interface IRoadObject 

- public class People implements IRoadObject 

- public class Vehicle 

- public class Truck extends Vehicle implements IRoadObject 

- public class Sedan extends Vehicle implements IRoadObject 

Cependant, il est toujours en fonction des besoins. Sans exigences claires comme la vôtre, je suppose que c'est assez simple.

0

Je pense que le véhicule & personnes est une bonne idée. J'utiliserais des classes abstraites pour ça.

Pensez également aux comportements. Un autobus scolaire a des comportements différents de ceux d'une motocyclette, et vous pouvez les mettre en œuvre avec des interfaces.

Regardez around here pour plus d'idées.