CA1033: Os métodos de interface devem 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 (explicitamente) reimplementa o método de interface herdada, a implementação base não pode mais ser acessada. A chamada por meio de referência de 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 é aceitável, uma alternativa é fazer o tipo selado.

Quando suprimir avisos

É seguro eliminar um aviso esta regra se é de um método visível externamente, desde que tenha 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();
      }
   }
}

Consulte também

Referência

Interfaces (C# Programming Guide)