CA1033: Typy potomne powinny móc wywoływać metody interfejsu
TypeName |
InterfaceMethodsShouldBeCallableByChildTypes |
CheckId |
CA1033 |
Kategoria |
Microsoft.Design |
Złamanie zmiany |
Bez podziału |
Przyczyna
Wyładunek typu widoczne z zewnątrz zapewnia Jawna implementacja metody interfejsu publicznego i nie stanowią alternatywną metodę widoczne z zewnątrz, który ma taką samą nazwę.
Opis reguły
Należy wziąć pod uwagę typu podstawowego, który wyraźnie implementuje metody interfejsu publicznego.Typ, który pochodzi od typu podstawowego mogą korzystać z metody interfejsu dziedziczone tylko poprzez odniesienie do bieżącej instancji (this w języku C#), jest oddanych do interfejsu.Jeśli typem pochodnym re-implements (jawnie) metoda interfejsu dziedziczone, implementacji podstawowej nie jest już możliwy.Połączenie za pośrednictwem bieżącego odwołania do wystąpienia będzie wywoływał realizacji pochodnych; Powoduje to, że rekursji i przepełnienie stosu ostatecznego.
Ta reguła nie zgłasza naruszenie dla wykonania jawnego IDisposable.Dispose podczas widoczne z zewnątrz Close() lub System.IDisposable.Dispose(Boolean) metoda jest świadczone.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, wdrożenia nowych metoda, która udostępnia taką samą funkcjonalność i jest widoczny dla typów pochodnych lub zmienić niejawne realizacji.Jeśli zmiana podziału jest dopuszczalne, alternatywą jest dokonanie typu sealed.
Kiedy do pomijania ostrzeżenia
Bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli jest metodą widoczne z zewnątrz, pod warunkiem że ma taką samą funkcjonalność, ale inną nazwą niż jawnie zaimplementowanej metodzie.
Przykład
W poniższym przykładzie pokazano typu, ViolatingBase, który narusza reguły i typ, FixedBase, pokazuje, że poprawka za łamanie.
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();
}
}
}