CA2222: 상속된 멤버 노출 수준을 낮추지 마십시오.
TypeName |
DoNotDecreaseInheritedMemberVisibility |
CheckId |
CA2222 |
범주 |
Microsoft.Usage |
변경 수준 |
주요 변경 아님 |
원인
unsealed 형식의 private 메서드에 기본 형식에서 선언된 public 메서드와 동일한 시그너처가 있습니다. private 메서드가 final이 아닙니다.
규칙 설명
상속된 멤버에 대한 액세스 한정자는 변경하면 안 됩니다. 상속된 멤버를 private으로 변경하더라도 호출자가 메서드의 기본 클래스 구현에 액세스하는 것을 막을 수 없습니다. 멤버가 private이고 형식이 unsealed인 경우 상속 형식은 상속 계층 구조에 있는 메서드의 마지막 public 구현을 호출할 수 있습니다. 액세스 한정자를 변경해야 하는 경우에는 메서드 재정의를 방지하기 위해 메서드를 final로 표시하거나 해당 형식을 sealed로 지정해야 합니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 액세스 한정자를 private이 아닌 액세스 한정자로 변경합니다. 또는 프로그래밍 언어에서 지원하는 경우 메서드를 final로 지정합니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다.
예제
다음 예제에서는 이 규칙을 위반하는 형식을 보여 줍니다.
Imports System
Namespace UsageLibrary
Public Class ABaseType
Public Sub BasePublicMethod(argument1 As Integer)
End Sub 'BasePublicMethod
End Class 'ABaseType
Public Class ADerivedType
Inherits ABaseType
' Violates rule DoNotDecreaseInheritedMemberVisibility.
Private Shadows Sub BasePublicMethod(argument1 As Integer)
End Sub 'BasePublicMethod
End Class 'ADerivedType
End Namespace
using System;
namespace UsageLibrary
{
public class ABaseType
{
public void BasePublicMethod(int argument1) {}
}
public class ADerivedType:ABaseType
{
// Violates rule: DoNotDecreaseInheritedMemberVisibility.
// The compiler returns an error if this is overridden instead of new.
private new void BasePublicMethod(int argument1){}
}
}