다음을 통해 공유


protected 멤버를 sealed 형식으로 선언하지 마십시오.

업데이트: 2007년 11월

TypeName

DoNotDeclareProtectedMembersInSealedTypes

CheckId

CA1047

범주

Microsoft.Design

변경 수준

주요 변경 아님

원인

public 형식이 sealed(Visual Basic의 경우 NotInheritable)이면서 보호된 멤버나 보호된 중첩 형식을 선언합니다. 이 규칙은 이 패턴을 따라야 하는 Finalize 메서드에 대해서는 위반을 보고하지 않습니다.

규칙 설명

형식에서는 상속하는 형식에서 멤버에 액세스하거나 멤버를 재정의할 수 있도록 하기 위해 protected 멤버를 선언합니다. 정의에 따르면 sealed 형식에서는 상속할 수 없습니다. 이것은 sealed 형식에 대해 protected 메서드를 호출할 수 없다는 의미입니다.

C# 컴파일러에서는 이 오류에 대해 경고를 발생시킵니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 멤버의 액세스 수준을 private으로 변경하거나 형식을 상속 가능하도록 만듭니다.

경고를 표시하지 않는 경우

이 규칙에서는 경고를 표시해야 합니다. 형식을 현재 상태로 그대로 두면 유지 관리 문제가 발생하므로 바람직하지 않습니다.

예제

다음 예제에서는 이 규칙을 위반하는 형식을 보여 줍니다.

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

위의 sealed 형식에서는 형식을 선언하는 클래스 외부에서 호출할 수 없는 protected 멤버를 선언합니다.

메서드가 다른 형식을 통해 호출되도록 디자인된 경우 해당 액세스 가능성을 public으로 높이고, 그렇지 않은 경우에는 private으로 낮춥니다.

다음 예제에서는 메서드의 액세스 가능성을 public으로 높여 위의 위반 문제를 해결합니다.

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