51 votes

En C #, avez-vous besoin d'appeler le constructeur de base?

En C #, si j'ai une classe héritée avec un constructeur par défaut, dois-je appeler explicitement le constructeur de la classe de base ou l'appellera-t-on implicitement?

 class BaseClass
{
    public BaseClass()
    {
        // ... some code
    }
}
class MyClass : BaseClass
{
    public MyClass() // Do I need to put ": base()" here or is it implied?
    {
        // ... some code
    }
}
 

57voto

Ian Nelson Points 20020

Vous n'avez pas besoin d'appeler explicitement le constructeur de base, il sera appelé implicitement.

Étendez un peu votre exemple et créez une application console et vous pourrez vérifier ce comportement vous-même:

 using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass foo = new MyClass();

            Console.ReadLine();
        }
    }

    class BaseClass
    {
        public BaseClass()
        {
            Console.WriteLine("BaseClass constructor called.");
        }
    }

    class MyClass : BaseClass
    {
        public MyClass()
        {
            Console.WriteLine("MyClass constructor called.");
        }
    }
}
 

29voto

Rob Cooper Points 15945

C'est implicite, à condition que ce soit sans paramètre. En effet, vous devez implémenter des constructeurs prenant des valeurs . Pour plus d’exemples, reportez-vous au code ci-dessous:

 public class SuperClassEmptyCtor
{
    public SuperClassEmptyCtor()
    {
        // Default Ctor
    }
}

public class SubClassA : SuperClassEmptyCtor
{
    // No Ctor's this is fine since we have
    // a default (empty ctor in the base)
}

public class SuperClassCtor
{
    public SuperClassCtor(string value)
    {
        // Default Ctor
    }
}

public class SubClassB : SuperClassCtor
{
    // This fails because we need to satisfy
    // the ctor for the base class.
}

public class SubClassC : SuperClassCtor
{
    public SubClassC(string value) : base(value)
    {
        // make it easy and pipe the params
        // straight to the base!
    }
}
 

8voto

Keith Points 46288

C'est implicite pour les constructeurs sans paramètre de base, mais c'est nécessaire pour les valeurs par défaut de la classe actuelle:

 public MyClass() 
    // no ref to base needed
{
    // initialise stuff
}

public MyClass( int param1, string param2 )
    :this() //if not explicit this will be :base()
{

}
 

6voto

John Downey Points 6729

C'est impliqué.

4voto

Tom Welch Points 144

Une classe dérivée est construite sur la classe de base. Si vous y réfléchissez, vous devez instancier l'objet de base en mémoire avant de pouvoir y ajouter la classe dérivée. Donc, l'objet de base sera créé sur le chemin de la création de l'objet dérivé. Donc non, vous n'appelez pas le constructeur.

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