No declarar miembros protegidos en tipos sealed

Actualización: noviembre 2007

Nombre de tipo

DoNotDeclareProtectedMembersInSealedTypes

Identificador de comprobación

CA1047

Categoría

Microsoft.Design

Cambio problemático

No problemático

Motivo

Un tipo público es sealed (NotInheritable en Visual Basic) y declara un miembro protegido o un tipo anidado protegido. Esta regla no realiza ningún informe sobre las infracciones para los métodos Finalize, que deben seguir este modelo.

Descripción de la regla

Los tipos declaran miembros protegidos para que los tipos heredados puedan obtener acceso o reemplazar el miembro. Por definición, no se puede heredar de un tipo sealed, lo que significa que no se puede llamar a los métodos protegidos en tipos sealed.

El compilador de C# emite una advertencia para este error.

Cómo corregir infracciones

Para corregir una infracción de esta regla, cambie el nivel de acceso del miembro a privado o cambie el tipo a heredable.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla. Si se mantiene el estado actual del tipo puede provocar problemas de mantenimiento y no proporciona ventajas.

Ejemplo

El siguiente ejemplo muestra un tipo que infringe esta regla.

Imports System

Namespace DesignLibrary

   Public NotInheritable Class BadSealedType
      Protected  Sub MyMethod
      End Sub
   End Class

End Namespace
using System;

namespace DesignLibrary
{
   public sealed class SealedClass
   {
      protected void ProtectedMethod(){}
   }
}

El tipo sealed anterior declara un miembro protegido al que no se puede llamar fuera de la clase que lo declara.

Si el método se diseñó para que lo llamen otros tipos, aumente su accesibilidad a pública; en caso contrario, redúzcala a privada.

En el ejemplo siguiente se corrige la infracción anterior aumentando la accesibilidad del método a pública.

Imports System

Namespace Samples

   Public NotInheritable Class Book
        Protected Sub Read      
    End Sub

   End Class

End Namespace
using System;

namespace Samples
{    
    public sealed class Book     
    {        
        protected void Read()        
        {        
        }    
    }
}