Не объявляйте защищенные члены в запечатанных типах
Обновлен: Ноябрь 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()
{
}
}
}