Виртуален член извиква конструктор, запечатан и атрибути

Имам следните структури:

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 запечатана

но след това се натъквам на проблема с това, че трябва да украся свойството с атрибута 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