CA1012: Abstract types should not have constructors

TypeName

AbstractTypesShouldNotHaveConstructors

CheckId

CA1012

Category

Microsoft.Design

Breaking Change

Non-breaking

Cause

A public type is abstract and has a public constructor.

Rule Description

Constructors on abstract types can be called only by derived types. Because public constructors create instances of a type, and you cannot create instances of an abstract type, an abstract type that has a public constructor is incorrectly designed.

How to Fix Violations

To fix a violation of this rule, either make the constructor protected or do not declare the type as abstract.

When to Suppress Warnings

Do not suppress a warning from this rule. The abstract type has a public constructor.

Example

The following example contains an abstract type that violates this rule.

Imports System     

Namespace Samples

    ' Violates this rule      
    Public MustInherit Class Book 

        Public Sub New()          
        End Sub 

    End Class 

End Namespace 
using System;

namespace Samples  
{   
    // Violates this rule      
    public abstract class Book      
    {          
        public Book()          
        {          
        }      
    } 
}

The following example fixes the previous violation by changing the accessibility of the constructor from public to protected.

Imports System     

Namespace Samples

    ' Violates this rule      
    Public MustInherit Class Book 

        Protected Sub New()          
        End Sub 

    End Class 

End Namespace 
using System;

namespace Samples  
{   
    // Violates this rule      
    public abstract class Book      
    {          
        protected Book()          
        {          
        }      
    } 
}