Udostępnij za pośrednictwem


CA2222: Nie zmniejszaj widoczności dziedziczonego elementu członkowskiego

TypeName

DoNotDecreaseInheritedMemberVisibility

CheckId

CA2222

Kategoria

Microsoft.Usage

Zmiana kluczowa

Niekluczowa

Przyczyna

Metoda prywatna w niezamkniętym typie ma sygnaturę identyczną z publiczną metodą zadeklarowaną w typie podstawowym.Metoda prywatna nie jest ostateczna.

Opis reguły

Nie należy zmieniać modyfikatora dostępu dla dziedziczonych elementów członkowskich.Zmiana dziedziczonego elementu członkowskiego na prywatny nie uniemożliwia wywołującym uzyskania dostępu do implementacji metody klasy podstawowej.Jeśli element członkowski jest prywatny, a typ nie jest zamknięty, dziedziczące typy mogą wywołać ostatnią publiczną implementację metody w hierarchii dziedziczenia.Jeśli trzeba zmienić modyfikator dostępu, metoda powinna zostać oznaczona jako ostateczna lub jej typ powinny zostać zamknięty, aby zapobiec zastąpieniu.

Jak naprawić naruszenia

Aby usunąć naruszenie tej zasady, należy zmienić dostęp do na nieprywatny.Ewentualnie, jeśli język programowania obsługuje taką możliwość, można uczynić metodę zamkniętą.

Kiedy pomijać ostrzeżenia

Nie należy pomijać ostrzeżenia dotyczącego tej reguły.

Przykład

Poniższy przykład pokazuje typ, który narusza regułę.

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