C# 从抽象类构造函数调用抽象方法
我想问一下,拥有以下产品的风险是什么:C# 从抽象类构造函数调用抽象方法,c#,oop,abstract-class,C#,Oop,Abstract Class,我想问一下,拥有以下产品的风险是什么: abstract public class HtmlTemplateBuilder { HtmlSource source; protected HtmlTemplateBuilder() { LoadTemplates(); } public abstract void LoadTemplates(); } 如果衍生类别衍生自衍生类别,则风险为: DerivedClass2->#Derived
abstract public class HtmlTemplateBuilder
{
HtmlSource source;
protected HtmlTemplateBuilder()
{
LoadTemplates();
}
public abstract void LoadTemplates();
}
如果衍生类别衍生自衍生类别,则风险为:
DerivedClass2->#DerivedClass1->HtmlTemplateBuilder
这可以通过密封DerviedClass1来解决,但是实现这一功能是否还有更多的风险或更好的实践
谢谢看看这个链接,它用简单易懂的例子解释了危险 我将从构造函数中删除对LoadTemplates的调用,并在实际需要加载和使用模板时对其调用Initialise
abstract public class HtmlTemplateBuilder
{
HtmlSource source;
object locker = new object();
private bool initialised;
protected HtmlTemplateBuilder()
{
}
protected void Initialise()
{
lock (locker)
{
if(initialised)
{
LoadTemplates();
initialised = true;
}
}
}
public abstract void LoadTemplates();
}
这种模式对我的影响如下:在以后的某个阶段,您需要添加一个专门的
HtmlTemplateBuilder
,它可以根据类本身未知的一些条件加载不同的模板(可能您决定在一年中的某一天需要一些很酷的模板)。即:
public class SpecialHtmlTemplateBuilder : HtmlTemplateBuilder
{
private bool someCondition;
public override void LoadTemplates()
{
if (someCondition)
{
LoadTemplatesSet1();
}
else
{
LoadTemplatesSet2();
}
}
}
但是,您将如何向类传递someCondition
?以下操作不起作用:
public class SpecialHtmlTemplateBuilder : HtmlTemplateBuilder
{
private bool someCondition;
public SpecialHtmlTemplateBuilder (bool someCondition)
{
this.someCondition = someCondition;
}
// ...
}
因为this.someCondition
的赋值将在调用基本构造函数之后完成,即调用LoadTemplates()
之后。请注意,密封派生类并不能解决此问题
解决此问题的方法如@Rahul Misra所述:添加一个显式的
Initialize
方法,并在构造函数之后调用该方法。您在示例中看到了什么风险?你能更具体一点吗?Resharper说(我理解为什么):虚拟成员调用构造函数。这或多或少是我解释的风险,在我的示例中,实现的责任在于派生类。我要求提供更好的、没有风险的解决方案。我会延迟加载模板。它不仅降低了将来可能有人通过更改您的类而重新引入风险的风险,而且还保持了对象的轻量级,直到实际使用为止。在需要加载模板的第一个点,通过在布尔标志中保持状态来检查是否加载了模板,否则加载。提供的链接已断开。这很有效:谢谢拉杰。我已经修好了链接。