Подтвердить что ты не робот

Виртуальные/Абстрактные поля в С#

Возможно ли иметь виртуальное/абстрактное поле в классе С#? Если да, то как это делается?

4b9b3361

Ответ 2

Первое предложение документации MSDN отвечает на ваш вопрос:

Виртуальное ключевое слово используется для изменения метода, свойства, индексатора или объявления события и позволяет переопределить его в производном классе.

http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx

Ответ 3

Нет, поле может быть назначено только, а не переопределено.

Однако вы могли бы использовать свойство, и оно выглядело бы почти таким же

public class MyClass {
  public int MyField; //field
  public virtual int MyProperty { get; set; }  //property
}

оба используются так:

var x = new MyClass();
Debug.WriteLine("Field is {0}", x.MyField);
Debug.WriteLine("Property is {0}", x.MyProperty);

Если потребитель использует отражение, он выглядит точно так же.

Ответ 4

Однако вы можете иметь виртуальные или абстрактные свойства:

public abstract string ModelName { get; set; }

Ответ 5

Нет. поля не могут быть виртуальными\абстрактными, но свойства могут.

Ответ 6

Поля - это места хранения в классе - вы не можете "переопределять" их или создавать виртуальные.

Свойства, с другой стороны, могут быть сделаны как виртуальными, так и абстрактными. Свойства - это просто синтаксический сахар вокруг методов get/set, которые выполняют работу по извлечению или настройке значения свойства.

Ответ 7

Свойства могут быть виртуальными, возможно, вы можете выиграть. По крайней мере, он широко используется в NHibernate.

В принципе, у вас должен быть метод виртуализации, как должно работать виртуальное поле?

Ответ 8

Нет. Вам нужно будет использовать свойство, чтобы выполнить то, что вам кажется, что делать.

Ответ 9

Старый вопрос, но вот мои 2 цента:

Хотя невозможно создать виртуальное поле - можно добиться того, что, по-видимому, ищет OP, то есть иметь значение поля производного класса, отличное от базы.

Просто присвойте ему "производное" значение в конструкторе.

(Хотя этого недостаточно, если у вас есть инициализаторы полей, такие как int i = 1; int j = i;).

Ответ 10

Возможно, однако, просто заменить новое поле. См. этот пример:

public class Program
{
    public class A
    {
        public int f = 3;
    }

    public class B
    {
        public int f = 9;
    }

    public static void Main(string[] args)
    {            
        B bb = new B();
        Console.WriteLine(bb.f); // writes 9
    }
}