2011-09-20 11 views
26

¿Es posible tener un campo virtual/abstracto en una clase C#? Si es así, ¿Cómo se hace?Campos virtuales/abstractos en C#

+3

No, un campo es solo de datos y no contiene ninguna lógica. No hay nada que anular, por lo que no tiene sentido tener campos virtuales. –

+0

¿Hay alguna manera de declarar un campo estático en la clase base, pero no proporcionar un valor, pero hacer que todas las subclases proporcionen el valor real? – user489041

+1

Imo un campo es un detalle de implementación, por lo que ** no debe ** ser posible. – BrokenGlass

Respuesta

41

A Virtual/Abstract field? No. Los campos están ahí para contener datos. No hay nada para implementar.

Usted puede define a Virtual/Abstract Property though.

+0

Esto parece hacer lo que necesito. Gracias. – user489041

7

No, un campo solo se puede asignar a no, se puede anular.

Sin embargo, probablemente podría utilizar una propiedad y que se vería casi el mismo

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

tanto acostumbrarse así:

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

A menos que el consumidor está utilizando la reflexión, que parece exactamente el mismo.

2

No. Los campos no pueden ser virtuales \ abstractos pero las propiedades pueden.

4

Puede sin embargo tiene propiedades virtuales o abstractos:

public abstract string ModelName { get; set; } 
1

campos son lugares de almacenamiento en una clase - no se puede "anular" o hacer lo virtual.

Las propiedades, por otro lado, se pueden hacer tanto virtuales como abstractas. Las propiedades son simplemente azúcar sintáctica alrededor de los métodos get/set, que hacen el trabajo de recuperar o establecer el valor de la propiedad.

1

Las propiedades pueden ser virtuales, puede ser que pueda obtener beneficios al respecto. Al menos es muy utilizado en NHibernate.

Básicamente tienes que tener un método para virtualizar, ¿cómo debería funcionar el campo virtual?

1

No. Tendría que usar una propiedad para lograr lo que parece que hacer.

1

Una cuestión de edad, pero aquí son mis 2 centavos:

Aunque uno podría no ser capaz de crear un campo virtual - una puede lograr lo que el PO parece estar buscando, lo que es tener el el valor del campo de la clase derivada será diferente que el de la base.

Simplemente asigne el valor "derivado" en el constructor.

(Aunque eso no será suficiente si tiene inicializadores de campo como int i = 1; int j = i;).

0

Sin embargo, es posible reemplazar el nuevo campo. Ver this example:

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