51 votes

La classe de base ne contient pas de constructeur sans paramètre ?

Je rends mes constructeurs un peu plus stricts en supprimant certains de mes constructeurs vides. Je suis assez novice en matière d'héritage, et j'étais perplexe face à l'erreur que j'ai reçue : Base Class Doesn't Contain Parameterless Constructor. Comment puis-je faire en sorte que A2 hérite de A sans qu'il y ait un constructeur vide dans A. De plus, pour ma propre compréhension, pourquoi A2 exige-t-il un constructeur vide pour A ?

Class A{
    //No empty constructor for A
    //Blah blah blah...
}

Class A2 : A{
    //The error appears here
}

89voto

Platinum Azure Points 22380

Dans la classe A2, vous devez vous assurer que tous vos constructeurs appellent le constructeur de la classe de base avec des paramètres.

Sinon, le compilateur supposera que vous voulez utiliser le constructeur de la classe de base sans paramètre pour construire l'objet A sur lequel votre objet A2 est basé.

Exemple :

class A
{
    public A(int x, int y)
    {
        // do something
    }
}

class A2 : A
{
    public A2() : base(1, 5)
    {
        // do something
    }

    public A2(int x, int y) : base(x, y)
    {
        // do something
    }

    // This would not compile:
    public A2(int x, int y)
    {
        // the compiler will look for a constructor A(), which doesn't exist
    }
}

8voto

Joe Points 60749

Exemple :

class A2 : A
{
   A2() : base(0)
   {
   }
}

class A
{
    A(int something)
    {
        ...
    }
}

2voto

Jakub Konecki Points 28852

Si votre classe de base n'a pas de constructeur sans paramètre, vous devez en appeler un depuis votre classe dérivée en utilisant base mot-clé :

class A
{
    public A(Foo bar)
    {
    }
}

class A2 : A
{
    public A2()
        : base(new Foo())
    {
    }
}

1voto

Bryan Crosby Points 4546

Il a pour appeler un constructeur. La valeur par défaut est un appel à base() .

Vous pouvez également utiliser des méthodes statiques, des littéraux et tout paramètre du constructeur actuel dans les appels à base() .

  public static class MyStaticClass
    {
        public static int DoIntWork(string i)
        {
            //for example only
            return 0;
        }
    }

    public class A
    {
        public A(int i)
        {
        }
    }

    public class B : A
    {
        public B(string x) : base(MyStaticClass.DoIntWork(x))
        {
        }
    }

0voto

Dennis Points 1410

Parce que si A n'a pas de constructeur par défaut, le constructeur de A2 doit appeler base() avec les arguments du constructeur de A. Voir cette question : Appel du constructeur de base en C#

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X