Виртуальные / Абстрактные поля в C # - PullRequest
31 голосов
/ 20 сентября 2011

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

Ответы [ 10 ]

50 голосов
/ 20 сентября 2011

Виртуальное / Абстрактное поле?Поля просто для хранения данных.Нет ничего для реализации.

Вы можете определить виртуальное / абстрактное свойство , хотя.

9 голосов
/ 20 сентября 2011

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

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

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

7 голосов
/ 20 сентября 2011

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

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

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);

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

6 голосов
/ 20 сентября 2011

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

public abstract string ModelName { get; set; }
2 голосов
/ 20 сентября 2011

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

1 голос
/ 08 августа 2013

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

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

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

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

1 голос
/ 20 сентября 2011

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

1 голос
/ 20 сентября 2011

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

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

1 голос
/ 20 сентября 2011

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

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

0 голосов
/ 05 июня 2017

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

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
    }
}
...