web-dev-qa-db-fra.com

Héritage avec constructeur de classe de base avec paramètres

Code simple:

class foo
{
    private int a;
    private int b;

    public foo(int x, int y)
    {
        a = x;
        b = y;
    }
}

class bar : foo
{
    private int c;
    public bar(int a, int b) => c = a * b;
}

Visual Studio se plaint du constructeur bar:

Erreur CS7036 Aucun argument donné ne correspond au paramètre formel requis x sur foo.foo(int, int).

Quelle?

79
zeusalmighty

Le problème est que la classe de base foo n'a pas de constructeur sans paramètre. Vous devez donc appeler le constructeur de la classe de base avec les paramètres du constructeur de la classe dérivée:

public bar(int a, int b) : base(a, b)
{
    c = a * b;
}
144
Dmitry

Je peux me tromper, mais je crois que puisque vous héritez de foo, vous devez appeler un constructeur de base. Puisque vous avez explicitement défini le constructeur foo de manière à ce que vous exigiez (int, int), vous devez maintenant passer cela dans la chaîne.

public bar(int a, int b) : base(a, b)
{
     c = a * b;
}

Cela initialisera les variables de foo en premier et ensuite vous pourrez les utiliser en barre. Aussi, pour éviter toute confusion, je vous recommande de ne pas nommer les paramètres exactement comme pour les variables d'instance. Essayez p_a ou quelque chose à la place, pour ne pas manipuler accidentellement la mauvaise variable.

23
guitar80