更新 : 2007 年 11 月
TypeName |
DoNotDeclareProtectedMembersInSealedTypes |
CheckId |
CA1047 |
カテゴリ |
Microsoft.Design |
互換性に影響する変更点 |
なし |
原因
パブリック型が sealed (Visual Basic では NotInheritable) であり、プロテクト メンバまたは入れ子にされたプロテクト型が宣言されています。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()
{
}
}
}