簡體   English   中英

CA1033具有屬性

[英]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?
    }
}

現在,從課堂之外,有兩種可能性:

  1. 當您擁有派生類的句柄時:

     new NewChemicalFormula().ChemicalFormula.GetType() // Error 

    要么

     // This works, is that what you intend to achieve? ((IChemicalFormula)new NewChemicalFormula()).ChemicalFormula.GetType() 
  2. 當您已經擁有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()之前必須將其NewChemicalFormulaNewChemicalFormula 僅僅因為該屬性返回this無助於解決此問題。

因此,FXCop警告值得考慮和評估設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM