[英]MSOCAF Verification - Do not call overridable methods in constructors
我在MSOCAF中有此錯誤:
“ ExcelChart.ExcelChart(ExcelDrawings,XmlNode,Uri,PackagePart,XmlDocument,XmlNode)”包含一個調用鏈,該調用鏈導致對該類定義的虛擬方法的調用。 查看以下調用堆棧以了解意外的結果:
ExcelChart..ctor(ExcelDrawings,XmlNode,Uri,PackagePart,XmlDocument,XmlNode)ExcelChart.InitChartLoad(ExcelDrawings,XmlNode):Voi ExcelChart.GetChartType(String):eChartType
構造函數:
internal ExcelChart(ExcelDrawings drawings, XmlNode node, Uri uriChart, PackagePart part, XmlDocument chartXml, XmlNode chartNode) :
base(drawings, node, "xdr:graphicFrame/xdr:nvGraphicFramePr/xdr:cNvPr/@name")
{
UriChart = uriChart;
Part = part;
ChartXml = chartXml;
_chartNode = chartNode;
InitChartLoad(drawings, chartNode);
ChartType = GetChartType(chartNode.LocalName);
}
和該行的錯誤:
XmlNode _chartNode = null;
internal XmlNode ChartNode
{
get
{
return _chartNode;
}
}
兩種方法:
private void InitChartLoad(ExcelDrawings drawings, XmlNode chartNode)
{
//SetChartType();
bool isPivot = false;
Init(drawings, chartNode);
_chartSeries = new ExcelChartSeries(this, drawings.NameSpaceManager, _chartNode, isPivot /*ChartXml.SelectSingleNode(_chartPath, drawings.NameSpaceManager)*/);
LoadAxis();
}
和
internal virtual eChartType GetChartType(string name)
{
switch (name)
{
case "area3DChart":
if(Grouping==eGrouping.Stacked)
{
return eChartType.AreaStacked3D;
}
else if (Grouping == eGrouping.PercentStacked)
{
return eChartType.AreaStacked1003D;
}
else
{
return eChartType.Area3D;
}
case "areaChart":
if (Grouping == eGrouping.Stacked)
{
return eChartType.AreaStacked;
}
else if (Grouping == eGrouping.PercentStacked)
{
return eChartType.AreaStacked100;
}
else
{
return eChartType.Area;
}
case "bubbleChart":
return eChartType.Bubble;
case "doughnutChart":
return eChartType.Doughnut;
case "pie3DChart":
return eChartType.Pie3D;
case "pieChart":
return eChartType.Pie;
case "radarChart":
return eChartType.Radar;
case "scatterChart":
return eChartType.XYScatter;
case "surface3DChart":
case "surfaceChart":
return eChartType.Surface;
case "stockChart":
return eChartType.StockHLC;
default:
return 0;
}
}
我在CodePlex中找到了此代碼,我嘗試解決MSOCAF返回的所有錯誤
構造函數ExcelChart()
調用虛擬方法GetChartType()
。 派生類可以重寫此方法,並使用在基類(ExcelChart)執行其構造函數時不存在或未初始化的數據。 基類的實現者無法知道或防止其類派生的后續代碼,並且從基類派生的人可能不知道基類ctor調用了他或她真正想要重寫的虛方法。
這就是為什么編碼准則通常禁止在ctor中調用虛擬方法。
請注意,虛擬方法的這種實現不同於C ++,在C ++中,調用這些虛擬方法位於ctor正在執行的類的vtable中。 也就是說,在嵌套ctor中,每個ctor都可以調用不同版本的“相同”虛擬方法。 相反,在C#中,總是調用繼承鏈中的“最派生”實現。 盡管這可能更簡單且更可預測,但它在某種程度上與繼承的概念背道而馳,並導致訪問基類不知道的數據的危險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.