Class et héritage

Signaler
Messages postés
3
Date d'inscription
dimanche 8 septembre 2002
Statut
Membre
Dernière intervention
10 janvier 2011
-
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
-
bonjour à tous.
Je bute sur un problème qui doit être hyper simple...

Je manipule des objets, par exemple des livres. Ces livres peuvent être des magazines, des BD ou des romans.
J'ai donc une classe pour chaque objet, à savoir :
class_magazines
class_bd
class_romans
Ces 3 classes héritent toutes d'une classe de base "class_livres".
Jusque là , vous me suivez...

Quand je créé un nouveau livre, je commence par rentrer les paramètres de base, commun à tous les livres. Pour cela, je créé une instance de class_livre (exemple "mon_livre") et, dans une première form, l'utilisateur entre les champs communs :
- nom
- auteur
- type_Livre, à choisir parmi {magazines, bd, romans}.

Selon ce dernier choix, j'instancie un nouvel objet correspondant au type de livre qu'il a sélectionné. S'il a choisi une BD, je créé une instance de class_bd, que j'appelle par exemple "ma_bd". Dans le constructeur, je passe en argument l'instance de la classe de base "mon_livre" et, dans le corps du constructeur, je fais :
ma_bd.nom = mon_livre.nom
ma_bd.auteur = mon_livre.auteur
...
Ensuite, dans une form propre aux BD, l'utilisateur remplit les champs de la BD.

Questions :
Je sens que ce n'est pas très propre. Le fait de créer une instance de la classe de base et une instance de la classe enfant pour ensuite faire du mapping, ce n'est pas très bien.
Mais je ne veux pas faire une form unique pour tous les types de livres car il y aurait plein de champs vides.

Peut-on créer une instance de type "object", qui hérite de la class de base et, qu'ensuite, lorsque l'utilisateur choisit son type de livre, on cast l'instance en class_bd par exemple ?
Peut-on créer une instance de type "class_livre" et ensuite la "compléter" en la transformant directement en une instance de la classe "class_bd" ?


Je ne sais pas si je suis clair, mais merci pour toute aide sur ce sujet.

Henri

4 réponses

Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
37
Salut,

Je ne pense pas que tu es compris le principe de la programmation objet et de l'heritage

Ta classe livre est ta classe mere et devrait etre abstraite
de maniere à ne pas l'instancier

Tes classes filles elle herite de la classe mere
et c'est elle que tu instancies et tu remplis les champs de la classes mere

Tu choisis ton type et tu instancies
tu ne fais pas le contraire instancies et complétion apres en fonction d'un parametre

exemple

Bd bd1 = new Bd();
bd1.Nom = "Tintin"; //classe mere
bd1.EnCouleur = true; //specifique à la bd


Et voila.
Messages postés
3
Date d'inscription
dimanche 8 septembre 2002
Statut
Membre
Dernière intervention
10 janvier 2011

Merci pour cet éclairage.
En fait, en instanciant directement un objet de la classe Bd, je suis coincé lorsque je veux simplement changer les champs de la classe de base "livre".
En effet une fois que l'utilisateur a choisi son type de livre, je veux qu'il puisse spécifier les champs communs dans une première FORM puis, dans une seconde FORM propre à son type de livre, les autres champs.

Comment faire alors une FORM pour les champs communs de la classe de base qui puisse s'appliquer à toutes les formes de livres ?
Dans la FORM où on entre les champs de base, j'ai :

public partial class FLivre : Form
{
class_Bd _maBd;

public FLivre(class_BD maBd)
{
_maBd = maBd;
}

public metAJourControles()
{
this.textBoxNom.text = _maBd.nom;
}
}


Le problème est que cette FORM ne "marche" que pour les objets de la classe Bd. Et j'aiemrai bien ne pas faire une form pour chaque type de livre...
En gros, comment faire une classe générique...

Merci.
J'espère que je suis clair...
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
37
Dans ce cas, il ne faut pas passé par un hieritage, mais une liste de propriétes sur ton objet
apres avec le type et des attributs sur tes propriétés tu peux faire une construction de forms dynamiques

et le tour est joué.
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
32
Bonjour foucauld

Je ne vois pas ou est ton problème, il semble que ton approche soit la bonne.

Si tu veux être "plus propre" tu peux dériver une classe "Data" ne contenant que les données communes.
Tu ajoutes un constructeur à ta classe de base nécessitant un objet de la classe Data comme paramètre
Tu instancies un objet de class Data lors de la prise de donnée et tu le passes au constructeur de l'objet à instancier.

Si le nombre de classes dérivées est fixe, alors
Tu peux aussi avoir un constructeur static dans ta classe de base
ex:

enum TypeLivre
{
    Bd,
    Roman,
    Magasin,
}
class Livres
{
    public string Nom { get; private set; }
    public string Titre { get; private set; }
    public TypeLivre Type { get; private set; }
    public Livres(string nom, string titre, TypeLivre type) 
    {
        Nom = nom;
        Titre = titre;
        Type = type;
    }
    static Livres Create(string nom, string titre, TypeLivre type)
    {
        switch (type)
        {
            case TypeLivre.Bd:
                return new Bd(nom, titre, type);
            case TypeLivre.Roman:
                return new Roman(nom, titre, type);
            case TypeLivre.Magasin:
                return new Magasin(nom, titre, type);
            default: 
                return null;
        }
    }


}
class Bd : Livres 
{
    public Bd(string nom, string titre, TypeLivre type) : base(nom, titre, type) { }
}
class Magasin : Livres 
{
    public Magasin(string nom, string titre, TypeLivre type) : base(nom, titre, type) { }
}
class Roman : Livres 
{
    public Roman(string nom, string titre, TypeLivre type) : base(nom, titre, type) { }
}



Bob.
C# is amazing, enjoy it!