次の方法で共有


シールされた型にプロテクト メンバを宣言しないでください

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