Sdílet prostřednictvím


CA1033: Metody rozhraní by měla být volatelné podřízenými typy

TypeName

InterfaceMethodsShouldBeCallableByChildTypes

CheckId

CA1033

Kategorie

Microsoft.Design

Narušující změna

Nenarušující

Příčina

Nezapečetěný externě viditelný typ poskytuje explicitní implementaci metod veřejného rozhraní a neposkytuje alternativní externě viditelné metody stejného názvu.

Popis pravidla

Uvažujme základní typ, který explicitně implementuje metodu veřejného rozhraní.Typ, který je odvozen od základního typu, může přistupovat ke zděděným metodám rozhraní pouze skrze odkaz na aktuální instanci (this v jazyce C#), který je přetypován na rozhraní.Pokud odvozený typ znovu implementuje (explicitně) zděděnou metodu rozhraní, není již základní implementace přístupná.Volání prostřednictvím odkazu na aktuální instanci vyvolá odvozenou implementaci, to způsobí rekurzi a případné přetečení zásobníku.

Toto pravidlo nehlásí narušení pro explicitní implementaci IDisposable.Dispose, pokud je k dispozici externě viditelná metoda Close() nebo System.IDisposable.Dispose(Boolean).

Jak vyřešit porušení

Pro opravu narušení tohoto pravidla, je nutné implementovat novou metodu, která vystavuje stejnou funkcionalitu a je viditelná pro odvozené typy, nebo změnit implementaci na neexplicitní.Pokud je akceptovatelná narušující změna, je alternativou typ zapečetit.

Kdy potlačit upozornění

Je bezpečné potlačit varování tohoto pravidla, pokud je poskytnuta externě viditelná metoda, která má stejnou funkcionalitu, ale jiný název, než explicitně implementovaná metoda.

Příklad

Následující příklad ukazuje typ, ViolatingBase, který porušuje pravidlo a typ, FixedBase, který ukazuje opravu narušení.

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

Viz také

Referenční dokumentace

Rozhraní (Průvodce programováním v C#)