Хорошо ли иметь конструктор в абстрактном классе? - PullRequest
10 голосов
/ 07 ноября 2010

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

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

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

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

    }
}

Ответы [ 4 ]

13 голосов
/ 07 ноября 2010

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

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

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

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

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

5 голосов
/ 07 ноября 2010

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

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

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

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

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

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

1 голос
/ 07 ноября 2010

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

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

0 голосов
/ 07 октября 2016

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

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

Пример:

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