[英]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.