CA2222 : Ne réduisez pas la visibilité des membres hérités
TypeName |
DoNotDecreaseInheritedMemberVisibility |
CheckId |
CA2222 |
Catégorie |
Microsoft.Usage |
Modification avec rupture |
Modification sans rupture |
Cause
Une méthode privée dans un type non-sealed (non scellé) présente une signature identique à une méthode publique déclarée dans un type de base. La méthode privée n'est pas finale.
Description de la règle
Vous ne devez pas modifier le modificateur d'accès destiné aux membres hérités. La modification d'un membre hérité au profit d'un état privé n'empêche pas les appelants d'accéder à l'implémentation de classe de base de la méthode. Si le membre est rendu privé et si le type est non-sealed (non scellé), hériter des types peut entraîner l'appel à la dernière implémentation publique de la méthode au sein de la hiérarchie d'héritage. Si vous devez changer le modificateur d'accès, la méthode doit être marquée comme finale ou son type doit être sealed (scellé) pour empêcher la substitution de la méthode.
Comment corriger les violations
Pour corriger une violation de cette règle, modifiez l'accès pour lui attribuer l'état non privé. Vous pouvez également rendre la méthode finale si votre langage de programmation le permet.
Quand supprimer les avertissements
Ne supprimez aucun avertissement de cette règle.
Exemple
L'exemple suivant affiche un type qui ne respecte pas cette règle.
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){}
}
}