2010-11-07 5 views
10

Хорошо ли иметь конструктор в абстрактном классе?Хорошо ли иметь конструктор в абстрактном классе?

Это хорошая практика программирования для создания конструктора абстрактного класса? поскольку абстрактные классы не могут быть инициализированы, их дочерние классы инициализируются.

Ниже приведена моя структура классов.

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

    } 
} 

ответ

12

Да, это абсолютно нормально. Просто потому, что конструктор может быть вызван только производными классами, это не значит, что он не будет полезен. Например, у вас может быть абстрактный класс, который представляет собой именованный объект какого-либо типа - было бы целесообразно принять имя в качестве параметра конструктора.

Возможно, стоило бы сделать конструктор защищенным, чтобы сделать его еще более очевидным, что вы не можете просто вызвать его из другого места.

Обратите внимание, что там быть конструктор (или несколько конструкторов) в абстрактном классе делает сила производный класс Конструкторы, чтобы пройти через него, но он не заставить производные классы имеют те же подписи конструктора. Например:

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

В этом случае производного класса конструктор «удаление» параметр (путем обеспечения постоянного значения в качестве аргумента в конструктор абстрактного класса), но в других случаях он может «добавить» параметры, которые его требуется или иметь смесь.

+0

hmm, хороший пример. –

+0

@JonSkeet жаль, что некромант сообщения с 2010 года, но у OP не было никаких параметров в их базовом конструкторе, стоит упомянуть, что вызов ': base()' в производном классе избыточен, если единственным ctor в базовом классе является значение по умолчанию (потому что его все равно называют). Я беспокоюсь о «скрытии» потребности в параметрах ctor, скажем, что базовый класс требует «IMagicWand», нет никакого способа, чтобы производный класс знал об этом требовании, пока компилятор не жалуется на него. * Это * моя проблема с защищенные конструкторы в абстрактных классах ... или я слишком задумываюсь об этом? –

5

Там нет абсолютно никаких причин, чтобы не иметь конструктор в абстрактном базовом классе.

Абстрактный класс инициализирован и работает так же, как и любой другой класс. В abstract ключевые слова делают только следующее:

  • Это предотвращает сам класс будет реализован напрямую. Он может быть создан только путем создания экземпляра унаследованного класса. Это не изменяет поведение инициализации по сравнению с не абстрактным базовым классом;

  • Это позволяет вам иметь абстрактные методы, свойства и события в классе.

Если вы, например. не имеют абстрактных методов, свойств или событий, точно такой же результат может быть достигнут путем создания конструктора класса protected (как и вы). Это также препятствует непосредственному созданию класса. Однако поведение не меняется по сравнению с абстрактным классом.

Первичная разница тогда становится способностью объявлять методы, свойства и события как абстрактные, которые вы можете делать только тогда, когда класс помечен abstract.

+0

Я специально говорю о 'abstract' классов. –

1

Наличие конструктора в абстрактном классе может быть полезно время от времени. Этот вопрос является дубликатом и имеет большое дело в соответствующей должности. Несмотря на то, что он специально ссылается на JAVA, концептуально это относится и к C#.

Can an abstract class have a constructor?

0

Конструкторы абстрактных типов можно назвать только производными типами.Поскольку публичные конструкторы создают экземпляры типа, и вы не можете создавать экземпляры абстрактного типа, абстрактный тип, который имеет открытый конструктор, неправильно разработан. CA1012: Abstract types should not have constructors

Исправить нарушение, изменив доступность конструктора от общедоступного до защищенного.

Пример:

namespace Sample 
{   
    public abstract class Book  
    {   
     protected Book()   
     {   
     }  
    } 
} 
Смежные вопросы