Geschützte Member in versiegelten Typen nicht deklarieren
Aktualisiert: November 2007
TypeName |
DoNotDeclareProtectedMembersInSealedTypes |
CheckId |
CA1047 |
Kategorie |
Microsoft.Design |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein öffentlicher Typ ist sealed (NotInheritable in Visual Basic) und deklariert einen geschützten Member oder einen geschützten geschachtelten Typ. Diese Regel meldet keine Verstöße bei Finalize-Methoden, die diesem Muster folgen müssen.
Regelbeschreibung
Typen deklarieren geschützte Member, damit erbende Typen auf den Member zugreifen oder diesen überschreiben können. Per Definition ist es nicht möglich, von einem versiegelten Typ zu erben. Dies bedeutet, dass geschützte Methoden auf versiegelten Typen nicht aufgerufen werden können.
Der C#-Compiler gibt bei diesem Fehler eine Warnung aus.
Behandlung von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, ändern Sie die Zugriffsebene des Members in privat, oder machen Sie den Typ erbbar.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel. Das Beibehalten des aktuellen Zustands des Typs kann Wartungsprobleme verursachen und bietet keine Vorteile.
Beispiel
Im folgenden Beispiel wird ein Typ veranschaulicht, der gegen diese Regel verstößt.
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(){}
}
}
Der obige versiegelte Typ deklariert einen geschützten Member, der außerhalb der ihn deklarierenden Klassen nicht aufgerufen werden kann.
Wenn andere Typen die Methode aufrufen können sollen, müssen Sie ihre Zugriffsmöglichkeit auf public festlegen. Legen Sie andernfalls die Zugriffsmöglichkeit auf private fest.
Im folgenden Beispiel wird die oben erwähnte Zugriffsverletzung behoben, indem der Zugriff auf die Methode auf public festgelegt wird.
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()
{
}
}
}