CA1033: Métodos de Interface devem ser podem ser chamados pelos tipos de filho
TypeName |
InterfaceMethodsShouldBeCallableByChildTypes |
CheckId |
CA1033 |
<strong>Categoria</strong> |
Microsoft.design |
Alteração significativa |
Não-separável |
Causa
Um tipo visível externamente sem lacre fornece uma implementação de método explícito de uma interface pública e não fornece um método alternativo de visível externamente que tem o mesmo nome.
Descrição da regra
Considere a possibilidade de um tipo de base que explicitamente implementa um método de interface pública.Um tipo que deriva do tipo base pode acessar o método de interface herdada apenas por meio de uma referência à instância atual (this em C#) que é um conversão para a interface.Se o tipo derivado reimplementa (explicitamente) o método de interface herdada, a implementação base não pode ser acessada.A chamada por meio de referência da instância atual irá chamar a implementação derivada; Isso causa recursão e um estouro de pilha eventual.
Esta regra não relata uma violação de uma implementação explícita de IDisposable.Dispose quando externamente visível Close() ou System.IDisposable.Dispose(Boolean) método é fornecido.
Como corrigir violações
Para corrigir uma violação desta regra, implementar um novo método que expõe a mesma funcionalidade e é visível para os tipos derivados ou altere para uma implementação não explícitas.Se uma alteração significativa for aceitável, uma alternativa é tornar o tipo selado.
Quando suprimir avisos
É seguro eliminar um aviso esta regra, se um método visível externamente for fornecido, que tem a mesma funcionalidade, mas um nome diferente do método implementado explicitamente.
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();
}
}
}