CA1033: Schnittstellenmethoden sollten von untergeordneten Typen aufgerufen werden können
TypeName |
InterfaceMethodsShouldBeCallableByChildTypes |
CheckId |
CA1033 |
Kategorie |
Microsoft.Design |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein unversiegelter, extern sichtbarer Typ gibt eine explizite Methodenimplementierung einer öffentlichen Schnittstelle an und gibt keine alternative extern sichtbare Methode mit dem gleichen Namen an.
Regelbeschreibung
Ziehen Sie einen Basistyp in Erwägung, der eine öffentliche Schnittstellenmethode explizit implementiert.Ein Typ, der vom Basistyp abgeleitet wird, kann auf die geerbte Schnittstellenmethode nur durch einen Verweis auf die aktuelle Instanz (this in C#) zugreifen, die in die Schnittstelle umgewandelt wird.Wenn der abgeleitete Typ die geerbte Schnittstellenmethode erneut (explizit) implementiert, kann auf die Basisimplementierung nicht mehr zugegriffen werden.Beim Aufruf über den aktuellen Instanzverweis wird die abgeleitete Implementierung aufgerufen. Dies führt zur Rekursion und schließlich zu einem Stapelüberlauf.
Von dieser Regel wird bei einer expliziten Implementierung von IDisposable.Dispose kein Verstoß gemeldet, wenn eine extern sichtbare Close()-Methode oder eine System.IDisposable.Dispose(Boolean)-Methode angegeben wird.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie eine neue Methode, die die gleiche Funktionalität verfügbar macht und für abgeleitete Typen sichtbar ist, oder verwenden Sie eine nicht explizite Implementierung.Wenn eine Unterbrechende Änderung zulässig ist, haben Sie auch die Möglichkeit, den Typ als versiegelten Typ zu definieren.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn eine extern sichtbare Methode angegeben wird, die die gleiche Funktionalität hat, aber einen anderen Namen aufweist als die explizit implementierte Methode.
Beispiel
Das folgende Beispiel zeigt einen Typ (ViolatingBase) der gegen die Regel verstößt, und einen Typ, FixedBase, der eine Korrektur des Verstoßes aufweist.
using System;
namespace DesignLibrary
{
public interface ITest
{
void SomeMethod();
}
public class ViolatingBase: ITest
{
void ITest.SomeMethod()
{
// ...
}
}
public class FixedBase: ITest
{
void ITest.SomeMethod()
{
SomeMethod();
}
protected void SomeMethod()
{
// ...
}
}
sealed public class Derived: FixedBase, ITest
{
public void SomeMethod()
{
// The following would cause recursion and a stack overflow.
// ((ITest)this).SomeMethod();
// The following is unavailable if derived from ViolatingBase.
base.SomeMethod();
}
}
}