2010-11-07 4 views
10

Est-il bon d'avoir un constructeur en classe abstraite?Est-ce bon d'avoir un constructeur en classe abstraite?

Est-ce une bonne pratique de programmation pour créer un constructeur de classe abstraite? Puisque les classes abstraites ne peuvent pas être initialisées, leurs classes enfants sont initialisées.

Voici ma structure de classe.

public abstract class Scheduler 
{ 
    private Storyboard timer; 

    protected Scheduler() 
    { 
     // initialize the timer here. 
     timer = new Storyboard(); 

     this.PollInterval = 60; 
    } 
} 


public class TaskScheduler : Scheduler 
{ 
    public TaskScheduler() 
     : base() 
    { 

    } 
} 

Répondre

12

Oui, il est tout à fait bien. Ce n'est pas parce que le constructeur ne peut être appelé que par des classes dérivées que cela ne sera pas utile. Par exemple, vous pourriez avoir une classe abstraite qui représente une entité nommée quelconque - il serait logique de prendre le nom en tant que paramètre constructeur.

Il serait probablement utile de protéger le constructeur, afin de rendre encore plus évident que vous ne pouvez pas l'appeler d'ailleurs.

Notez que qu'il y ait un constructeur (ou plusieurs constructeurs) dans une classe abstraite ne la force des constructeurs de classe dérivée à passer par là, mais il n'a pas forcer les classes dérivées d'avoir les mêmes signatures du constructeur. Par exemple:

public abstract class NamedFoo 
{ 
    private readonly string name; 
    public string Name { get { return name; } } 

    protected NamedFoo(string name) 
    { 
     this.name = name; 
    } 
} 

public class DerivedFooWithConstantName 
{ 
    public DerivedFooWithConstantName() : base("constant name") 
    { 
    } 
} 

Dans ce cas, le constructeur de la classe dérivée est « DEPOSE » un paramètre (en fournissant une valeur constante comme argument au constructeur de classe abstraite) mais dans d'autres cas, il pourrait « ajouter » paramètres que requis, ou avoir un mélange.

+0

hmm, bon exemple. –

+0

@JonSkeet désolé de nécromancer un post de 2010 mais l'OP n'avait pas de params dans son constructeur de base, il vaut la peine de mentionner qu'appeler ': base()' dans une classe dérivée est redondant si le seul ctor de la classe de base est celui par défaut (parce que ça s'appelle quand même). J'ai un souci de "cacher" le besoin des paramètres de ctor, disons que la classe de base nécessite un 'IMagicWand', il n'y a aucun moyen pour la classe dérivée de connaître cette exigence jusqu'à ce que le compilateur s'en plaint - * c'est mon problème avec constructeurs protégés dans les classes abstraites ... ou est-ce que je suis en train de trop réfléchir? –

5

Il n'y a absolument aucune raison de ne pas avoir un constructeur dans une classe de base abstraite.

La classe abstraite est initialisée et fonctionne comme n'importe quelle autre classe. Les mots-clés ne font que abstract les éléments suivants:

  • Il empêche la classe elle-même être instanciée directement. Il ne peut être instancié qu'en instanciant une classe héritée. Cela ne change pas le comportement de l'initialisation par rapport à une classe de base non abstraite;

  • Il vous permet d'avoir des méthodes abstraites, des propriétés et des événements dans la classe.

Si vous effectuez par ex. n'ont pas de méthodes abstraites, propriétés ou événements, exactement le même résultat peut être accompli en faisant le constructeur d'une classe protected (comme vous l'avez fait). Cela empêche également l'instanciation de la classe directement. Le comportement ne change cependant pas par rapport à une classe abstraite.

La différence principale devient alors la possibilité de déclarer des méthodes, des propriétés et des événements comme abstraits que vous ne pouvez faire que lorsque la classe est marquée abstract.

+0

Je parle plus précisément de classes 'abstract'. –

1

Avoir un constructeur en classe abstraite peut être utile à certains moments. Cette question est un doublon, et traité beaucoup dans un poste connexe. Même s'il fait spécifiquement référence à JAVA, conceptuellement il s'applique également à C#.

Can an abstract class have a constructor?

0

Les constructeurs de types abstraits ne peuvent être appelés que par des types dérivés.Étant donné que les constructeurs publics créent des instances d'un type et que vous ne pouvez pas créer d'instances d'un type abstrait, un type abstrait qui a un constructeur public est mal conçu. CA1012: Abstract types should not have constructors

Correction de la violation en modifiant l'accessibilité du constructeur du public à protégé.

Exemple:

namespace Sample 
{   
    public abstract class Book  
    {   
     protected Book()   
     {   
     }  
    } 
} 
Questions connexes