2010-11-07 24 views
10

¿Es bueno tener un constructor en clase abstracta?¿Es bueno tener un constructor en clase abstracta?

¿es una buena práctica de programación crear un constructor de clase abstracta? como las clases abstractas no se pueden inicializar, sus clases secundarias se inicializan.

La siguiente es la estructura de mi clase.

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() 
    { 

    } 
} 

Respuesta

12

sí, es absolutamente bien. El hecho de que el constructor solo pueda ser llamado por clases derivadas no significa que no sea útil. Por ejemplo, puede tener una clase abstracta que represente una entidad con nombre de algún tipo; tendría sentido tomar el nombre como un parámetro de constructor.

Probablemente valdría la pena proteger el constructor, para que sea aún más obvio que no se puede simplemente llamar desde otro lugar.

Tenga en cuenta que no es un constructor (o varios constructores) en una clase abstracta qué constructores de clase derivada fuerza para pasar por ella, pero no significa obligar a las clases derivadas de tener las mismas firmas constructoras. Por ejemplo:

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") 
    { 
    } 
} 

En este caso, el constructor de la clase derivada se "eliminar" un parámetro (proporcionando un valor constante como el argumento del constructor de clase abstracta), pero en otros casos podría "add" parámetros que se requerido, o tiene una mezcla.

+0

hmm, buen ejemplo. –

+0

@JonSkeet siento negar una publicación desde 2010 pero el OP no tenía params en su constructor base, vale la pena mencionar que llamar ': base()' en una clase derivada es redundante si el único ctor en la clase base es el predeterminado (porque se llama de todos modos). Tengo una preocupación acerca de "ocultar" la necesidad de los parámetros de ctor, digamos que la clase base requiere un 'IMagicWand', no hay forma de que la clase derivada sepa de ese requerimiento hasta que el compilador se queje al respecto - * ese es * mi problema con constructores protegidos en clases abstractas ... ¿o estoy pensando demasiado en esto? –

5

no hay absolutamente ninguna razón para no tener un constructor en una clase base abstracta.

La clase abstracta se inicializa y funciona igual que cualquier otra clase. Las palabras clave única abstract hacer lo siguiente:

  • Previene la clase en sí a una instancia directamente. Solo se puede crear una instancia al crear una clase heredada. Esto no cambia el comportamiento de la inicialización en comparación con una clase base no abstracta;

  • Le permite tener métodos abstractos, propiedades y eventos en la clase.

Si, p. no tiene métodos abstractos, propiedades o eventos, exactamente el mismo resultado se puede lograr haciendo el constructor de una clase protected (como lo hizo). Esto también evita que la clase sea instanciada directamente. Sin embargo, el comportamiento no cambia en comparación con una clase abstracta.

La diferencia principal se convierte en la capacidad de declarar métodos, propiedades y eventos como abstractos, lo que solo se puede hacer cuando la clase está marcada abstract.

+0

estoy hablando específicamente 'clases abstract'. –

1

Tener constructor en clase abstracta puede ser útil a veces. Esta pregunta es un duplicado y trata mucho en una publicación relacionada. A pesar de que específicamente hace referencia a JAVA, conceptualmente también se aplica a C#.

Can an abstract class have a constructor?

0

Los constructores en tipos abstractos solo se pueden llamar por tipos derivados.Debido a que los constructores públicos crean instancias de un tipo y no puede crear instancias de un tipo abstracto, un tipo abstracto que tiene un constructor público está incorrectamente diseñado. CA1012: Abstract types should not have constructors

Solucione la infracción cambiando la accesibilidad del constructor de public a protected.

Ejemplo:

namespace Sample 
{   
    public abstract class Book  
    {   
     protected Book()   
     {   
     }  
    } 
} 
Cuestiones relacionadas