[英]CA1033 with Properties
當我使用“ Microsoft管理推薦規則”規則集運行代碼分析(VS2013)時,針對類庫的唯一警告是CA1033類型:“子類應該可以調用接口方法” 。 但是在這種情況下我不理解規則:
/// An object that has a chemical formula
public interface IChemicalFormula
{
/// The chemical formula of the object
ChemicalFormula ChemicalFormula {get;}
}
public class ChemicalFormula: IChemicalFormula
{
ChemicalFormula IChemicalFormula.ChemicalFormula
{
get { return this; }
}
}
文檔建議使用相同的名稱制作一個受保護的方法,以便派生類型可以訪問它,但是您不能使用與封閉類型相同的方法來命名。 他們還建議將類密封,但在這種情況下我不希望將其密封。 這是否只是一次忽略此規則,還是有適當的方法來處理它?
編輯
為了澄清為什么以這種方式設計類/接口,我還有另一個類Peptide
,它包含一個IChemicalFormula[]
數組來存儲修改。 並非每個修改都必須直接衍生自ChemicalFormula
,但是它們需要實現IChemicalFormula
接口。 因此,如果我用某個分子(例如H2O)修飾某個肽的實例,則ChemicalFormula
類也需要實現IChemicalFormula
。
這是規則的描述:
考慮一個顯式實現公共接口方法的基本類型。 從基本類型派生的類型只能通過引用強制轉換為接口的當前實例(在C# 中為 this)來訪問繼承的接口方法。 如果派生類型重新實現(顯式)繼承的接口方法,則無法再訪問基本實現。 通過當前實例引用進行的調用將調用派生的實現。 這會導致遞歸並最終導致堆棧溢出。
我認為您應該考慮評估此屬性的使用。 一個很好的例子,其中可以使用TDD來確定接口。 下面有一些可能的用法(和一些無效的用法)。 我不確定您打算通過這些實現什么。
在您的示例中,假設另一個類NewChemicalForumla
派生自ChemicalForumula
,並且引用了ChemicalFormula
,這是什么意思?
public class NewChemicalFormula: ChemicalFormula
{
public void Method()
{
Console.WriteLine("{0}", ChemicalFormula.GetType()); // Compile error
Console.WriteLine("{0}", this.ChemicalFormula.GetType()); // Effectively same as above, compile error
Console.WriteLine("{0}", ((IChemicalFormula)this).ChemicalFormula.GetType()); // Works, is that what you intend?
}
}
現在,從課堂之外,有兩種可能性:
當您擁有派生類的句柄時:
new NewChemicalFormula().ChemicalFormula.GetType() // Error
要么
// This works, is that what you intend to achieve? ((IChemicalFormula)new NewChemicalFormula()).ChemicalFormula.GetType()
當您已經擁有IChemicalFormula的句柄時。 在這種情況下,ChemicalFormula似乎是多余的:
IChemicalFormula formula = new NewChemicalFormula(); Console.WriteLine("{0}", formula.GetType()); // Works, returns NewChemicalFormula Console.WriteLine("{0}", formula.ChemicalFormula.GetType()); // Works, returns NewChemicalFormula Console.WriteLine("{0}", formula.ChemicalFormula.Method()); // Compile error
formula.ChemicalFormula.Method()
導致錯誤,因為在使用Method()
之前必須將其NewChemicalFormula
為NewChemicalFormula
。 僅僅因為該屬性返回this
無助於解決此問題。
因此,FXCop警告值得考慮和評估設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.