繁体   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