Поделиться через


Не объявляйте защищенные члены в запечатанных типах

Обновлен: Ноябрь 2007

TypeName

DoNotDeclareProtectedMembersInSealedTypes

CheckId

CA1047

Категория

Microsoft.Design

Критическое изменение

Не критическое

Причина

Открытый тип имеет атрибут sealed (NotInheritable в Visual Basic) и объявляет защищенный член или защищенный вложенный тип. Это правило не учитывает нарушения для методов Finalize, для которых такой шаблон обязателен.

Описание правила

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

Компилятор C# выдает предупреждение для этой ошибки.

Предотвращение нарушений

Чтобы исправить нарушение этого правила, измените уровень доступа члена на закрытый или сделайте тип наследуемым.

Отключение предупреждений

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

Пример

В следующем примере демонстрируется тип, нарушающий это правило.

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

Указанный выше запечатанный тип объявляет защищенный член, который нельзя вызвать вне класса, который го объявляет.

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

В следующем примере нарушение устраняется: метод получает открытый уровень доступа.

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