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说(我理解为什么):虚拟成员调用构造函数。这或多或少是我解释的风险,在我的示例中,实现的责任在于派生类。我要求提供更好的、没有风险的解决方案。我会延迟加载模板。它不仅降低了将来可能有人通过更改您的类而重新引入风险的风险,而且还保持了对象的轻量级,直到实际使用为止。在需要加载模板的第一个点,通过在布尔标志中保持状态来检查是否加载了模板,否则加载。提供的链接已断开。这很有效:谢谢拉杰。我已经修好了链接。