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