Возможно ли иметь виртуальное/абстрактное поле в классе С#? Если да, то как это делается?
Виртуальные/Абстрактные поля в С#
Ответ 1
Виртуальное/абстрактное поле? Нет. Поля только для хранения данных. Там ничего не реализовать.
Вы можете определить виртуальное/абстрактное свойство.
Ответ 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
}
}