Heritage et Constructeur

Signaler
Messages postés
1123
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
-
Messages postés
4
Date d'inscription
lundi 14 décembre 2009
Statut
Membre
Dernière intervention
29 mai 2010
-
Bonjour à tous :)
Voila, nouveau en C# je suis bloqué sur un problème d'héritage.
J'ai une classe mère abstraite, AbsClass, qui contient un constructeur public AbsClass (int val1, int val2, bool val3);
J'ai une classe fille qui étends AbsClass : ChildClass : AbsClass

Je ne met pas de constructeur dans cette classe fille, juste une méthode setValue ();

Quand je compile le tout, j'obtient cette erreur :
"No overload method for method AbsClass takes 0 arguments"

Pour le moment j'ai du implémenter dans mes classes filles le constructeur ChildClass (int val1, int val2, bool val3) : base (val1, val2, val3);
mais j'espere qu'il y a une méthode plus "logique" car j'ai 20 classes filles et j'envisage de modifier le constructeur de la classe abstraite ... :p

Merci de votre aide
A voir également:

12 réponses

Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008

Une classe heritant d'une classe abstraite doit : _ soit surcharger toutes les methodes abstraite dont elle herite
                                                                       _ soit etre elle meme abstraite
Messages postés
1123
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
Ne le prenez pas mal mais :
C'est débile !!!!

Je m'explique :
Si je fait une classe abstraite, c'est justement pour éviter la redondance de code dans mes classes filles. Hors déjà rien que là ça prouve le contraire.
De plus, si maintenant j'ai beaucoup de classes filles qui étendent une classe abstraite, et que je désire modifier le constructeur de la classe mere, il va faloir que je fasse les modifs dans TOUTES les classes filles ?!!!!! C'est pas vraiment du principe de la POO ca ? Sur ce coup là, Java marque un point (sans vouloir lancer un troll ;))

En tout cas merci de vos réponses :)
, centre R&D de mes projets :)
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
c'est pourquoi les constructeurs ne doivent pas avoir 50 paramètres...

l'idéale, c'est une méthode static qui te construit une nouvelle instance de ton objet.

Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]
Messages postés
1123
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
Oué je pense que ce sera la seule solution.

C'est quand même bizare de réagir comme ca alors qu'il suffit de remonter sur les classes parent. Je ne comprends vraiment pas microsoft sur ce point !

En tout cas merci pour l'idée, je pense que je vais me tourner vers cette solution ! :)
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
je crois que ce n'est pas Microsoft qui fait de travers... c'est un principe de la POO.

Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]
Messages postés
1123
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
En fait c'est pas le cas sous php et je trouvais ca bien plus logique. Puisqu'une classe fille possède les objets public et private de la classe mère, ce qu'il manque dans la classe fille, on va le chercher dans la classe mere, comme un constructeur :p

Le probleme c'est pas que j'ai 50 parametres, c'est juste que si je veux en modifier un, il faut tout modifier. Mais jvais faire ca avec un singleton et des getters/setters et zou :p

Merci de ton aide
Messages postés
1123
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
public et protected, pardon ! :)
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Puisque tu as crée un ctor avec paramêtre le compilo ne crée pas le ctor sans paramêtre, à toi de le définir :

internal abstract class Base
{
    protected int val = -1;


    public Base( )
    {
        // ..
    }


    public Base( int val )
    {
        this.val = val;
    }
}


internal class Derive : Base
{
    public void SetValue( int val )
    {
        this.val = val;
    }
}
Messages postés
1123
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
Euh là je ne suis pas sur de comprendre, ta une classe mere avec deux constructeur possibles, et t'a une classe fille avec une méthode SetValue qui contient la meme signature qu'un de deux constructeurs. En quoi SetValue va indiquer au compilateur que meme sans définir un constructeur fils spécifique il s'y retrouvera ?
Ou tu veux dire que pour chaque valeurs à définir par le constructeur parent, il faut faire des setters pour permettre de gerer ses valeurs si on les appels pas directement dans le constructeur ?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Mon code c'est pour éviter le message d'erreur "No overload method for method AbsClass takes 0 arguments" dans le cas ou la classe dérivée ne doit pas appeler le ctor paramètré de sa classe de base mais plutôt utiliser une méthode SetValue.
Messages postés
4
Date d'inscription
lundi 14 décembre 2009
Statut
Membre
Dernière intervention
29 mai 2010

salut tout le monde je voudrais savoir es ce que je peux realiser l'heritage dans sql server 2005
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
Salut,

le constructeur de la classe fille DOIT surcharger celui dans la classe abstraite.

ex :

public ClassB ( int val1, int val2, int val3 ) : base( val1, val2, val3) {}

Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]