Partilhar via


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

Consulte também

Referência

Interfaces (guia de programação C#)