Вызов виртуального члена в конструкторе, запечатанном и атрибутах

У меня есть следующие конструкции:

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 о вызове виртуального члена в Ctor. Я подумал:

  • сделать A.Foo виртуальным
  • запечатать B.Foo override

но затем я столкнулся с проблемой: мне нужно украсить свойство атрибутом Bar ...

Мне не нужно отменять Foo в C, кроме как по этому факту; так есть ли способ добиться этого?


person Tom Fobear    schedule 22.07.2014    source источник
comment
Вы можете создать обычное свойство в A с резервным полем и добавить перегруженный конструктор, который устанавливает значение этого резервного поля, также в A, а затем связать его с этим конструктором из B. Таким образом, не будет виртуального вызова ни в каком конструкторов, и вам не придется запечатывать B.   -  person Lasse V. Karlsen    schedule 22.07.2014


Ответы (1)


Если все, что вы делаете в конструкторе B, - это установка значения по умолчанию для Foo, просто используйте свойство с резервным полем и установите значение по умолчанию в инициализаторе поля:

public class B : A
{
 private string foo = "test";

 [Bar(1, 2)]
 public override string Foo
 {
  get { return foo; }
  set { foo = value; }
 }
} 
person dugas    schedule 22.07.2014