构造函数中的虚拟成员调用#

virtual member call in constructor c#

在我的抽象 ClassA 的构造函数中,我正在调用一个虚拟方法并收到警告。

https://msdn.microsoft.com/en-us/library/ms182331.aspx

https://www.ndepend.com/default-rules/Q_Constructor_should_not_call_a_virtual_method.html

public abstract class ClassA
{
    private int m_number;
    protected ClassA()
    {
         m_number = GetNumber()
    }

    protected abstract int GetNumber(); 
}

public class ClassB : ClassA
{
    public ClassB() : base()
    {
    }

    protected override int GetNumber()
    {
        return 10;
    }    
}

如果我稍微更改 ClassA 中的代码并通过另一种方法间接调用该虚拟方法,我不会收到任何警告。

现在这是一个好的设计吗?我不明白下面的设计可能比上一个有什么优势。

public abstract class ClassA
{
    private int m_number;
    protected ClassA()
    {
         m_number = GetNumberIndirectly()
    }

    private int GetNumberIndirectly()
    {
        return GetNumber();
    }

    protected abstract int GetNumber(); 
}

这可能是另一种方式:

public abstract class ClassA
{
    private int m_number;
    protected ClassA(int n)
    {
         m_number = n;
    }

    //protected abstract int GetNumber(); 
}

public class ClassB : ClassA
{
    public ClassB() : base(10)
    {
    }

    //protected override int GetNumber()
    //{
    //    return 10;
    //}    
}