Appel classe abstraite

betty555 Messages postés 38 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 6 juillet 2010 - 8 juin 2009 à 10:46
betty555 Messages postés 38 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 6 juillet 2010 - 8 juin 2009 à 15:37
Bonjour,

J'ai un petit problème avec une classe abstraite, il y a l'appel du contructeur mais comme on a pas de constructeur dans une classe abstraite comment m'y prendre?

public class AchatCarte{
    public String achat{
InitAchat initAchat=new InitAchat(x); //Je voudrai remplacer InitAchat par sa classe Abstraite..
}
}
public abstract class AbstractInitAchat{
...
}
public class InitAchat extends AbstractInitAchat{
//constructeur
public InitAchat(String x){
...
}
}

Merci pour vos réponses,

8 réponses

kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
8 juin 2009 à 10:50
Salut,

une classe abstraite ne peut pas être instanciée mais elle a un constructeur. Quel est le pb exactement ?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
8 juin 2009 à 11:00
Tu ne peux pas instancier une classe abstraite, par contre, tu peux instancier une classe concrete et utiliser le type de la classe abstraite :

public class abstract AbstractClass {
public AbstractClass(String param) {
}
}

public class ConcreteClass extends AbstractClass {
public ConcreteClass(String param) {
super(param);
}
}

Et ensuite :
AbstractClass classe = new ConcreteClass();

et tu peux utiliser ton objet class comme s'il s'agissait d'un AbstractClasse (bien que réellement il s'agit d'une ConcreteClass).

Note : il vaut mieux utiliser la délégation que l'héritage en java si tu ne veux pas fermer ton arborescence de classe tout en évitant la duplication de code !
0
betty555 Messages postés 38 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 6 juillet 2010
8 juin 2009 à 11:24
Bonjour,

Je ne veux pas avoir de dépendances entre AchatCarte et InitAchat, c'est pourquoi j'ai créé une classe abstraite AbstractInitAchat, qui permettera d'instancier InitAchat sans avoir à dépendre de celle ci; ainsi je ferai appel de AbstractInitAchat dans AchatCarte.

Dans la classe abstraite:
-------------------------------
public abstract class AbstractInitAchat{
public static AbstractInitAchat instance = (AbstractInitAchat) ....// là j'instancie InitAchat à l'aide des fichiers properties...
public abstractInitAchat getInstance(){
return instance;
}
//j'ai pas définit de constructeur
}
-------------------------
public class InitAchat extends AbstractInitAchat{
//constructeur
public InitAchat(String x) {
...
}
}
----------------------------
Donc dans AchatCarte:
public class AchatCarte{
    public String achat{
InitAchat initAchat =new InitAchat(x); //Je voudrai remplacer InitAchat par sa classe Abstraite..
}
}
0
betty555 Messages postés 38 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 6 juillet 2010
8 juin 2009 à 11:40
Bonjour,
Est ce que c'est une bonne solution??

public abstract class AbstractInitAchat{
public static
AbstractInitAchat instance = (AbstractInitAchat) ....// là j'instancie
InitAchat à l'aide des fichiers properties...
public abstractInitAchat getInstance (String x) {
return instance;
}
}
-------------------------
public class InitAchat extends AbstractInitAchat{
//constructeur
public InitAchat(String x){
...
}
}
----------------------------
Donc dans AchatCarte:
public class AchatCarte{
    public String achat{
AbstractInitAchat a =AbstractInitAchat.getInstance(x);
}
}

Merci d'avance,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
8 juin 2009 à 12:20
Ca peut être une solution, mais ca crée une dépendance forte entre ta classe abstraite et ta classe concrète, et du coup, ca revient au même...

La solution serait plutôt :
public class InitAchat extends AbstractInitAchat{
//constructeur
public InitAchat(String x){
...
}
}

public abstract class AbstractInitAchat{
public static AbstractInitAchat instance;
public void setInstance(AbstractInitAchat instance){
this.instance = instance;
}
public void getInstance(){
return instance;
}
}

Ainsi c'est la classe cliente qui définir quelle InitAchat elle veut utiliser, et au niveau de ta classe abstraite, il n'y a plus de dépendance vers la classe concrete.

Ou encore mieux : implémenter le pattern Fabrique qui sert justement à cà...
0
betty555 Messages postés 38 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 6 juillet 2010
8 juin 2009 à 14:21
Bonjour,

Dans ma classe abstraite je dois instancier la classe InitAchat, sinon instance retournée est nulle, donc je dois instancier cette classe a l'aide d'un fichier proprieté, où je metterai que ma classe abstraite fais reference a ma classe InitAchat, public static AbstractInitAchat instance (AbstractInitAchat) fwk..getObject(AbstractInitAchat.class) // j'implemente le pattern fabriqué comme tu as dis , dans le ficher .properties, je fais reference a ma classe  ....AbstractInitAchat ....InitAchat

Et ca marche, sauf que, est ce qu'il y a toujours une dépendance entre ma classe abstraite et ma classe concrete?

Et est ce que InitAchat initAchat=new InitAchat(x) est equivalent à AbstractInitAchat a =AbstractInitAchat.getInstance(x); ?

Merci beaucoup pour tes réponses...
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
8 juin 2009 à 14:51
Tu nous dis que tu ne dois pas avoir de dépendance entre AchatCarte et InitAchat, du coup, si tu as InitAchat qui dépend de AbstractInitAchat qui lui même dépend de AchatCarte, autant enlever la classe abstraite puisque de toute façon tu auras toujours la dépendance entre AchatCarte et InitAchat !

C'est pour cà qu'il ne faut absolument pas que tu ai la moindre référence à la classe AchatCarte que ce soit dans la classe InitAchat comme dans la classe abstraite ! (tu ferais mieux de faire une interface d'ailleurs plutôt qu'une classe abstraite, mais bon, à toi de voir).

Par contre, ce que je comprends pas dans tes explications, c'est : "je dois instancier cette classe a l'aide d'un fichier proprieté, où je metterai que ma classe abstraite fais reference a ma classe InitAchat" : comment veux-tu créer une instance avec un seul fichier properties ? Le fichier properties ne contient que du texte...

Si tu fais une fabrique qui se charge de créer l'instance à partir du texte du fichier properties et te retourne l'instance d'InitAchat sous la forme que tu veux (Object, Abstract, Interface ou autre) ca suffira presque : il ne faudras par utiliser la fabrique à partir de ta classe InitAchat, car sinon rebingo : tu crée une dépendance vers InitAchat...

C'est au client de ta classe AchatCarte de définir quel AbstractAchat il faut utiliser, et alors là oui, enfin, tu n'auras plus de dépendances !
0
betty555 Messages postés 38 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 6 juillet 2010
8 juin 2009 à 15:37
AchatCarte ne doit pas dependre de InitAchat, AbstractInitAchat ne doit pas dependre de InitAchat non plus, parceque ces deux classes, (AchatCarte et AbstractInitAchat ) vont etre communs, mais InitAchat peut tres bien dependre de Abstract pusiqu'il y aura un héritage... c'est vrai que quand je vais instancier la classe InitAchat dans ma classe abstraite, je serai obligée d'avoir une dépendance entre abstract et la classe concrete c'est pourquoi je fait appel a un fichier .properties.

Je mets:

AbstractInitAchat instance =(AbstractInitAchat) fwkClass.getObject(abstractInitAchat.class);
// cette une class fwkClass (designPatterns..) est deja fabriquée, elle permet de generer des objects, la methode getObject, va chercher dans le fichier .properties, ma classe passé en parametre(abstraite), et trouver ainsi ma classe concrete InitAchat. une fois le type concret est trouvee, la methode getObject va trouver le constructeur sans parametre de cette classe..et puis instancier...
0
Rejoignez-nous