Udostępnij za pośrednictwem


CA1033: Typy potomne powinny móc wywoływać metody interfejsu

TypeName

InterfaceMethodsShouldBeCallableByChildTypes

CheckId

CA1033

Kategoria

Microsoft.Design

Złamanie zmiany

Bez podziału

Przyczyna

Wyładunek typu widoczne z zewnątrz zapewnia Jawna implementacja metody interfejsu publicznego i nie stanowią alternatywną metodę widoczne z zewnątrz, który ma taką samą nazwę.

Opis reguły

Należy wziąć pod uwagę typu podstawowego, który wyraźnie implementuje metody interfejsu publicznego.Typ, który pochodzi od typu podstawowego mogą korzystać z metody interfejsu dziedziczone tylko poprzez odniesienie do bieżącej instancji (this w języku C#), jest oddanych do interfejsu.Jeśli typem pochodnym re-implements (jawnie) metoda interfejsu dziedziczone, implementacji podstawowej nie jest już możliwy.Połączenie za pośrednictwem bieżącego odwołania do wystąpienia będzie wywoływał realizacji pochodnych; Powoduje to, że rekursji i przepełnienie stosu ostatecznego.

Ta reguła nie zgłasza naruszenie dla wykonania jawnego IDisposable.Dispose podczas widoczne z zewnątrz Close() lub System.IDisposable.Dispose(Boolean) metoda jest świadczone.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, wdrożenia nowych metoda, która udostępnia taką samą funkcjonalność i jest widoczny dla typów pochodnych lub zmienić niejawne realizacji.Jeśli zmiana podziału jest dopuszczalne, alternatywą jest dokonanie typu sealed.

Kiedy do pomijania ostrzeżenia

Bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli jest metodą widoczne z zewnątrz, pod warunkiem że ma taką samą funkcjonalność, ale inną nazwą niż jawnie zaimplementowanej metodzie.

Przykład

W poniższym przykładzie pokazano typu, ViolatingBase, który narusza reguły i typ, FixedBase, pokazuje, że poprawka za łamanie.

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

Zobacz też

Informacje

Interfejsy (Przewodnik programowania w języku C#)