在构造函数、密封和属性中调用虚成员

本文关键字:调用 成员 属性 构造函数 密封 | 更新日期: 2023-09-27 18:14:03

我有以下结构:

public abstract class A
{
    public abstract string Foo {get;set;}
}
public class B : A
{ 
    public B() { Foo = "test" } //ReSharper: Virtual member call in constructor
    [Bar(1, 2)]
    public override string Foo {get;set;}
}
public class C : B
{
    [Bar(2,3)]
    public override string Foo {get;set}
}

正如你所看到的,我从ReSharper得到一个关于在actor中调用虚拟成员的警告。所以我想:

  • 使A.Foo虚拟
  • 使B.Foo覆盖密封

但后来我遇到了问题,我需要用Bar属性装饰属性…

我不需要在C中重写Foo,除了这个事实;那么,有没有办法做到这一点呢?

在构造函数、密封和属性中调用虚成员

如果您在B的构造函数中所做的只是为Foo设置默认值,则只需使用带有支持字段的属性并在字段初始化器中设置默认值:

public class B : A
{
 private string foo = "test";
 [Bar(1, 2)]
 public override string Foo
 {
  get { return foo; }
  set { foo = value; }
 }
}