Campi virtuali / astratti in C #

È ansible avere un campo virtuale / astratto in una class C #? Se è così, come è fatto?

Un campo virtuale / astratto? No. I campi sono lì solo per contenere i dati. Non c’è niente da implementare.

Tuttavia, è ansible definire una proprietà virtuale / astratta .

La prima frase della documentazione MSDN risponde alla tua domanda:

La parola chiave virtuale viene utilizzata per modificare un metodo, una proprietà, un indicizzatore o una dichiarazione di evento e consentirne la sostituzione in una class derivata.

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

No, un campo può essere assegnato solo a non, sovrascritto.

Tuttavia, potresti probabilmente usare una proprietà e sembrerebbe quasi la stessa

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

entrambi si abituano così:

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

A meno che il consumatore non stia usando la riflessione, sembra esattamente la stessa cosa.

Puoi tuttavia avere proprietà virtuali o astratte:

 public abstract string ModelName { get; set; } 

No. I campi non possono essere virtuali \ astratti ma le proprietà possono.

I campi sono posizioni di archiviazione in una class: non puoi “ignorarli” o renderli virtuali.

Le proprietà, d’altra parte possono essere rese sia virtuali che astratte. Le proprietà sono semplicemente zucchero sintattico attorno ai metodi get / set, che fanno il lavoro di recupero o impostazione del valore della proprietà.

Le proprietà possono essere virtuali, può essere che tu possa ottenere su questo. Almeno è pesantemente utilizzato in NHibernate.

Fondamentalmente devi avere un metodo per virtualizzare, come dovrebbe funzionare il campo virtuale?

No. Dovresti usare una proprietà per realizzare ciò che sembri cosa fare.

Una vecchia domanda, ma qui ci sono i miei 2 centesimi:

Sebbene uno non sia in grado di creare un campo virtuale, è ansible ottenere ciò che l’OP sembra cercare, il che significa che il valore del campo della class derivata deve essere diverso da quello della base.

Assegnagli semplicemente il valore “derivato” nel costruttore.

(Anche se non sarà sufficiente se si hanno inizializzatori di campo come int i = 1; int j = i; ).

È tuttavia ansible sostituire semplicemente il nuovo campo. Vedi questo esempio :

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