【问题标题】:Virtual member call in constructor in abstract class抽象类的构造函数中的虚拟成员调用
【发布时间】:2014-03-03 15:01:58
【问题描述】:

我从 ReSharper 收到一条警告消息,指出 Classification = new T(); 上的“构造函数中的虚拟成员调用”:

public abstract class Creature<T> where T : new() {

     protected Creature()
     {
        Classification = new T();
     }

    public abstract T Classification { get; protected set; } 
}

public class Dog : Creature<Animal>
{
    public override Animal Classification { get; protected set; }

}

public class Animal{

public void AnimalSpecificMethod() { }

}

我该如何解决这个问题?也许是重新设计这个结构的想法?

我想要实现的是在 Dog 类中创建相同的类类型,其中包含通过 Creature 类声明的分类。

谢谢!

【问题讨论】:

  • 分类属性真的需要抽象吗?你会在 getter 和 setter 中做任何特定的事情吗?如果不是,就让它成为非抽象的(非虚拟的)。
  • 警告是因为您在派生类被构造之前调用了派生类的方法......它可能会让您对异常开放,因为派生类的属性尚未初始化。最简单的就是创建一个init函数
  • 自动实现的属性是邪恶的?

标签: c#


【解决方案1】:

问题是这个调用,在构造函数中,是对setter的虚拟调用:

Classification = new T();

您可以改为添加一个字段支持的属性,这样可以避免该问题:

protected Creature()
{
  _classification = new T();
}

private T _classification;

public virtual T Classification
{
  get { return _classification; }
  protected set { _classification = value; }
}

这看起来确实是一个奇怪的设计,但如果没有更多关于您想要实现的目标的详细信息,我无法提供任何具体的设计建议。 Dog / Classification 示例过于笼统,无法提供具体建议。上述更改将解决您眼前的问题。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 2010-10-02
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2019-05-06
    相关资源
    最近更新 更多