61 votes

Pourquoi ne puis-je pas créer un constructeur abstrait sur une classe abstraite C #?

Je suis entrain de créer une classe abstraite. Je veux que chacune de mes classes dérivées pour être obligée de mettre en œuvre une signature spécifique du constructeur. En tant que tel, j'ai fait ce que j'aurais fait a je voulait les forcer à mettre en œuvre une méthode, j'ai fait un résumé.

public abstract class A
{
    abstract A(int a, int b);
}

Cependant, je reçois un message disant que le modificateur abstract n'est pas valide sur ce point. Mon but était de forcer un code de ce genre.

public class B : A
{
    public B(int a, int b) : base(a, b)
    {
        //Some other awesome code.
    }
}

C'est tout le C# .NET code. Quelqu'un peut-il m'aider?

Mise à jour 1

Je voulais ajouter quelques choses. Ce que j'ai fini avec ça.

private A() { }

protected A(int a, int b)
{
    //Code
}

Qui fait ce que certaines personnes disent, par défaut est privé, et la classe doit implémenter un constructeur. Cependant cela ne veut pas FORCER un constructeur avec la signature d'Un(int a, int b).

public abstract class A
{
    protected abstract A(int a, int b)
    {


    }
}

Mise à jour 2

Je doit être clair, pour travailler autour de ce que j'ai fait mon constructeur par défaut privé, et mon autre constructeur protégé. Je ne suis pas vraiment à la recherche d'un moyen de rendre mon code du travail. J'ai pris soin de cela. Je cherche à comprendre pourquoi C# ne pas vous laisser faire cela.

53voto

Tamas Czinege Points 49277

Vous ne pouvez pas avoir un résumé constructeur car abstrait signifie que vous devez remplacer dans n'importe quel non-abstraite de la classe enfant et vous ne pouvez pas remplacer un constructeur.

Si vous pensez à ce sujet, cela fait sens, car il vous suffit d'appeler le constructeur de la classe fille (avec l'opérateur new) et de ne jamais la classe de base.

Généralement parlant, la seule solution en C# pour faire respecter un spécifique de la signature du constructeur est à l'aide de la nouvelle (les) contrainte générique, qui impose l'existence d'un constructeur sans paramètre pour le paramètre type.

26voto

Jamie Penney Points 2821

Remplacez ce constructeur de la classe A par

 protected A(int a, int b)
{
    // Some initialisation code here
}
 

Ensuite, vos sous-classes devront l’utiliser, car il n’existe pas de constructeur par défaut.

Ils peuvent toutefois toujours modifier la signature réelle du constructeur. Autant que je sache, il est impossible de forcer une sous-classe à utiliser une signature spécifique pour son constructeur. Je suis sûr que les constructeurs ne peuvent pas être abstraits.

Pourquoi avez-vous besoin de cela? Nous pourrions peut-être suggérer un moyen de contourner ce problème.

7voto

John Saunders Points 118808

Bien que vous ne puissiez pas remplacer les constructeurs, et par conséquent, vous ne puissiez pas définir de constructeur abstrait, vous pouvez placer une méthode de fabrique abstraite dans votre classe de base abstraite. Toutes les classes dérivées devraient remplacer cela.

 public abstract class A 
{ 
    abstract A MakeAInstance(int a, int b); 
} 

public class B : A 
{ 
    // Must implement:
    override A MakeAInstance(int a, int b) {
        // Awesome way to create a B instance goes here
    }
} 
 

5voto

Mats Points 51

Plusieurs raisons:

1) Les constructeurs ne sont pas hérités, vous ne pouvez donc pas les remplacer.

2) Le constructeur est une fonction membre statique car il n'a pas besoin d'appeler une instance spécifique. Abstrait implique "virtuel", ce qui signifie que la mise en oeuvre peut varier en fonction de la manière dont une instance spécifique est sous-classée, ce qui est le contraire de l'intention de la signification du mot clé "statique".

4voto

devio Points 22981

Vous ne pouvez pas appliquer la signature du constructeur, car chaque classe dérivée peut (doit!) Définir ses propres constructeurs et peut prendre tous les paramètres de son choix.

Si vous devez passer un ensemble de variables donné à un objet d'une classe dérivée, définissez une méthode abstraite devant être implémentée par des classes dérivées. Si les classes n'implémentent pas la méthode abstraite, vous obtiendrez une erreur du compilateur.

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