Partilhar via


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();
      }
   }
}

Consulte também

Referência

Interfaces (Guia de Programação em C#)