构造函数中的虚拟成员调用#
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;
//}
}
在我的抽象 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;
//}
}