共用方式為


CA1033:介面方法應該要可以由子型別呼叫

型別名稱

InterfaceMethodsShouldBeCallableByChildTypes

CheckId

CA1033

分類

Microsoft.Design

中斷變更

中斷

原因

非密封外部可見的型別會提供公用介面的明確方法實作,但未提供同名的替代外部可見方法。

規則描述

請考慮明確實作公用介面方法的基底型別 (Base Type)。 衍生自基底型別的型別只能透過轉換成介面之目前執行個體 (在 C# 中為 this) 的參考,存取繼承介面方法。 如果衍生型別 (Derived Type) 明確重新實作繼承介面方法,就無法再存取基底實作。 透過目前執行個體參考的呼叫將會叫用衍生實作 (Derived Implementation),這會造成遞迴和最終堆疊溢位的結果。

若提供外部可見的 Close() 或 System.IDisposable.Dispose(Boolean) 方法,此規則不會報告 IDisposable.Dispose 的明確實作違規。

如何修正違規

若要修正此規則的違規情形,請實作公開相同功能且衍生型別可見的新方法,或變更為非明確實作。 如果可以接受中斷變更,另一種方式就是使型別密封。

隱藏警告的時機

如果外部可見的方法具有相同的功能,但是名稱與明確實作方法的名稱不同,則您可以放心地隱藏這項規則的警告。

範例

下列範例會顯示違反規則的型別 (ViolatingBase),以及顯示修正違規的型別 (FixedBase)。

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

請參閱

參考

介面 (C# 程式設計手冊)