Нужно ли предоставлять пустой защищенный конструктор для абстрактного класса?

Я знаю, что конструкторы в абстрактных классах должны быть защищены в C#.

Но некоторым абстрактным классам не нужны беспараметрические конструкторы. Например:

public abstract MyAbstractClass {
    public abstract Method1();
    public abstract Method2();
    // non-parameterless constructors are not needed
}

Мой вопрос в вышеприведенном классе, мне нужно предоставить пустой защищенный конструктор для переопределения неявного конструктора по умолчанию? То есть:

public abstract MyAbstractClass {
    protected MyAbstractClass() { }

    public abstract Method1();
    public abstract Method2();
}

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

Но когда я проверяю исходный код ASP.NET MVC framework, я вижу, что они не предоставляют пустой защищенный конструктор для абстрактных классов. Итак, может быть, правило дизайна должно быть:

Если вы определяете конструкторы в абстрактных классах, они не должны быть публичными.

Если вам не нужны беспараметрические конструкторы в абстрактных классах, просто не определяйте их.

Какие-нибудь мысли?

1 ответ

Решение

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

Другие вопросы по тегам