CA1033: os métodos de interface devem ser chamáveis por tipos filho
TypeName |
InterfaceMethodsShouldBeCallableByChildTypes |
CheckId |
CA1033 |
Categoria |
Microsoft.Design |
Alteração Significativa |
Sem quebra |
Causa
Um tipo externamente visível unsealed fornece uma implementação explícita de método de uma interface pública e não fornece um método externamente visível de backup que tem o mesmo nome.
Descrição da Regra
Considere um tipo de base que implementa explicitamente um método da interface pública.Um tipo que deriva do tipo de base pode acessar o método herdado da interface somente com uma referência à instância atual (this em C#) que é convertida para a interface.Se os novamente implementa derivados do tipo () explicitamente o método herdado da interface, a implementação de base não poderão mais ser acessados.Chame com a referência da instância atual invocará a implementação derivada; isso faz com que a recursão e um estouro de pilha eventual.
Esta regra não informa uma violação de uma implementação explícita de IDisposable.Dispose quando Close() um método ou externamente visível de System.IDisposable.Dispose(Boolean) são fornecidos.
Como Corrigir Violações
Para corrigir uma violação desta regra, implemente um novo método que expõe a mesma funcionalidade e é visível a tipos derivados ou a modificação em uma implementação nonexplicit.Se uma alteração for aceitável, uma alternativa é fazer o tipo selado.
Quando Suprimir Alertas
É seguro suprimir um aviso dessa regra se um método externamente visível fornecida tem a mesma funcionalidade mas um nome diferente do método explicitamente implementado.
Exemplo
O exemplo a seguir mostra um tipo, ViolatingBase, que viola a regra e um tipo, FixedBase, que mostra uma correção para a violação.
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();
}
}
}