Constructors of abstract classes should be declared as protected or private
Constructors of abstract classes can only be called from derived classes, and instances of an abstract class cannot be created: a public constructor there is wrong design. A private constructor means derived classes must be nested in the abstract class.
How to fix
Declare the constructor protected, or don't declare the type abstract.
CQLinq source
This rule is written in CQLinq, C# LINQ over the NDepend code model. It ships with every new NDepend project: you can read it, adapt it, or use it as a starting point for your own custom rules.
//<Name>Constructors of abstract classes should be declared as protected or private</Name>
// <Id>ND1806:ConstructorsOfAbstractClassesShouldBeDeclaredAsProtectedOrPrivate</Id>
warnif count > 0
from t in Application.Types where
t.IsClass &&
t.IsAbstract
let ctors = t.Constructors.Where(c => !c.IsProtected &&
!c.IsPrivate &&
!c.IsProtectedAndInternal)
where ctors.Count() > 0
from ctor in ctors
select new {
ctor,
baseClass = t,
Debt = 30.ToSeconds().ToDebt(),
Severity = Severity.Medium
}
//<Expl>
// This constructor should be declared as *protected*
// since its parent *{1}* is abstract and can only be
// instantiated from its derived classes.
//</Expl>
//<Desc>
// Constructors of abstract classes can only be called from derived classes,
// and instances of an *abstract* class cannot be created: a public
// constructor there is wrong design. A private constructor means derived
// classes must be nested in the abstract class.
//</Desc>
//<HowToFix>
// Declare the constructor *protected*, or don't declare the type *abstract*.
//</HowToFix>
Open in the interactive Rules Explorer · All default rules
Visibility: all 12 items
- Methods that could have a lower visibility ND1800
- Types that could have a lower visibility ND1801
- Fields that could have a lower visibility ND1802
- Types that could be declared as private, nested in a parent type ND1803
- Avoid publicly visible constant fields ND1804
- Fields should be declared as private or protected ND1805
- Constructors of abstract classes should be declared as protected or private ND1806
- Avoid public methods not publicly visible ND1807
- Event handler methods should be declared as private or protected ND1808
- Wrong usage of CannotDecreaseVisibilityAttribute ND1809
- Exception classes should be declared as public ND1810
- Methods that should be declared as 'public' in C#, 'Public' in VB.NET