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

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

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

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

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

    }
}

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Может ли абстрактный класс иметь конструктор?

Ответ 4

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

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

Пример:

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