web-dev-qa-db-fra.com

Champs virtuels / abstraits en C #

Est-il possible d'avoir un champ virtuel/abstrait dans une classe C #? Si oui, comment est-il fait?

31
user489041

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.

51
Justin Niessner

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

9
qJake

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.

7
George Mauer

Vous pouvez cependant avoir des propriétés virtuelles ou abstraites:

public abstract string ModelName { get; set; }
6
Blindy

Non. Les champs ne peuvent pas être virtuels\abstraits mais les propriétés le peuvent.

2
CD..

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

1
LBushkin

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?

1
Yurii Hohan

Non. Vous devez utiliser une propriété pour accomplir ce que vous semblez faire.

1
Eric Farr

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

1
ispiro