CA1033:接口方法应可由子类型调用

类型名

InterfaceMethodsShouldBeCallableByChildTypes

CheckId

CA1033

类别

Microsoft.Design

是否重大更改

非重大更改

原因

未密封的外部可见类型提供了显式实现公共接口的方法,但没有提供具有相同名称的其他外部可见方法。

规则说明

请考虑显式实现公共接口方法的基类型。 从该基类型派生的类型只能通过对被强制转换为接口的当前实例(C# 中的 this)的引用来访问继承的接口方法。 如果派生的类型重新实现(显式)继承的接口方法,则无法再访问基实现。 通过当前实例引用进行的调用将调用派生的实现;这会导致递归调用,并最终导致堆栈溢出。

当提供了外部可见的 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# 编程指南)