Est-il possible d'avoir un champ virtuel/abstrait dans une classe C #? Si oui, comment est-il fait?
Un champ virtuel/abstrait? Non. Les champs sont juste là pour contenir des données. Il n'y a rien à mettre en œuvre.
Vous pouvez définir une propriété virtuelle/abstraite cependant.
La première phrase de la documentation MSDN répond à votre question:
Le mot-clé virtuel est utilisé pour modifier une méthode, une propriété, un indexeur ou une déclaration d'événement et lui permettre d'être remplacé dans une classe dérivée.
http://msdn.Microsoft.com/en-us/library/9fkccyh4 (v = vs.80) .aspx
Non, un champ ne peut être affecté qu'à non, remplacé.
Cependant, vous pourriez probablement utiliser une propriété et elle aurait presque la même apparence
public class MyClass {
public int MyField; //field
public virtual int MyProperty { get; set; } //property
}
les deux s'habituent ainsi:
var x = new MyClass();
Debug.WriteLine("Field is {0}", x.MyField);
Debug.WriteLine("Property is {0}", x.MyProperty);
À moins que le consommateur n'utilise la réflexion, elle a exactement la même apparence.
Vous pouvez cependant avoir des propriétés virtuelles ou abstraites:
public abstract string ModelName { get; set; }
Non. Les champs ne peuvent pas être virtuels\abstraits mais les propriétés le peuvent.
Les champs sont des emplacements de stockage dans une classe - vous ne pouvez pas les "remplacer" ou les rendre virtuels.
Les propriétés, en revanche, peuvent être rendues à la fois virtuelles ou abstraites. Les propriétés sont simplement du sucre syntaxique autour des méthodes get/set, qui effectuent le travail de récupération ou de définition de la valeur de la propriété.
Les propriétés peuvent être virtuelles, vous pouvez y gagner. Au moins, il est fortement utilisé dans NHibernate.
Fondamentalement, vous devez avoir une méthode pour virtualiser, comment le champ virtuel devrait-il fonctionner?
Non. Vous devez utiliser une propriété pour accomplir ce que vous semblez faire.
Une vieille question, mais voici mes 2 cents:
Bien que l'on ne puisse pas créer un champ virtuel - on peut réaliser ce que l'OP semble rechercher, c'est-à-dire avoir les champs de la classe dérivée être différente de celle de la base.
Attribuez-lui simplement la valeur "dérivée" dans le constructeur.
(Bien que cela ne suffise pas si vous avez des initialiseurs de champ comme int i = 1; int j = i;
).