Métodos de interface devem ser podem ser chamados por tipos de filhos
TypeName |
InterfaceMethodsShouldBeCallableByChildTypes |
CheckId |
CA1033 |
Category (Categoria) |
Microsoft.Design |
Quebrando alterar |
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 visível externamente com o mesmo nome.
Descrição da regra
Considere um tipo de base que explicitamente implementa um método de interface pública.Um tipo que deriva do tipo de base só pode acessar o método de interface herdada através de uma referência à instância corrente (this em translation from VPE for Csharp) que é um conversão para a interface. Se o tipo derivado (explicitamente) reimplementa o método de interface herdada, a implementação base não está mais acessível.A telefonar por meio de referência de instância corrente irá chamar a implementação derivada; isso resultados em um estouro de pilha eventual e de recursão.
Esta regra não relata uma violação de uma implementação explícita de IDisposable.Dispose Quando um visível externamente Close() ou System.IDisposable.Dispose(Boolean) método é fornecido.
Como corrigir violações
Para corrigir uma violação dessa regra, implementar um novo método que expõe a mesma funcionalidade e é visível para tipos derivados ou altere para uma implementação não explícita.Se uma alterar significativa for aceitável, uma alternativa é fazer o tipo sealed.
Quando suprimir avisos
É seguro eliminar um aviso essa regra se um método visível externamente for fornecido, que tem a mesma funcionalidade, mas um nome diferente que o 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();
}
}
}