sirve que programacion para c# variables new-operator overrides

que - ¿Cómo anulo, no oculto, una variable miembro(campo) en una subclase de C#?



static programacion (5)

Quiero que esto me diga el nombre de ambos, ItemA y ItemB. Debería decirme "Subitem / nSubitem", pero en cambio me dice "Item / nSubitem". Esto se debe a que la variable "Nombre" definida en la clase de Subelemento es técnicamente una variable diferente a la variable "Nombre" definida en la clase de Artículo base. Quiero cambiar la variable original a un nuevo valor. No entiendo por qué esto no es la cosa más fácil de todos, ya que considerar los métodos virtuales y de anulación funciona perfectamente con los métodos. No he podido descubrir cómo reemplazar una variable.

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Example { class Program { static void Main(string[] args) { System.Console.WriteLine(ItemA.Name); System.Console.WriteLine(ItemB.Name); System.Console.ReadKey(); } static Item ItemA = new Subitem(); static Subitem ItemB = new Subitem(); } public class Item { public string Name = "Item"; } public class Subitem : Item { new public string Name = "Subitem"; } }


¿Qué significa "anular una variable"?

Una variable es una ubicación con nombre en la memoria conceptual ("conceptual", porque podría ser un registro, aunque no es muy probable con campos).

La anulación de un método sustituye un conjunto de operaciones por otro.

Dado que una ubicación nombrada en la memoria no es un conjunto de operaciones, ¿cómo puede sustituirla? ¿Qué se supone que deben hacer las cosas que esperan usar esa ubicación con nombre en la memoria?

Si desea cambiar lo que está almacenado en la memoria, simplemente hágalo cuando se construya la clase derivada:

public class Item { public string Name = "Item"; } public class Subitem : Item { public SubItem() { Name = "Subitem"; } }

Si desea anular un conjunto de operaciones, defina un conjunto de operaciones (un método o una propiedad) para anular.


Esta pregunta es relativamente antigua y el autor probablemente estaba usando C # 5.0 o inferior. Pero tuve la misma pregunta y encontré una solución muy ordenada que funciona con C # 6.0 y superior que quiero compartir con ustedes:

C # 6.0 ofrece la posibilidad de inicializar propiedades automáticas. Así que uno puede usar eso:

public class Item { public virtual string Name { get; set; } = "Item"; } public class Subitem : Item { public override string Name { get; set; } = "Subitem"; }


No hay ningún concepto de polimorfismo (que es lo que hace que la override haga su trabajo) con campos (lo que se llama una variable). Lo que necesitas usar aquí es una propiedad.

public class Item { public virtual string Name { get { return "Item"; } } } public class SubItem : Item { public override string Name { get { return "Subitem"; } } }


No puede anular las variables en C #, pero puede anular las propiedades:

public class Item { public virtual string Name {get; protected set;} } public class Subitem : Item { public override string Name {get; protected set;} }

Otro enfoque sería cambiar el valor en la subclase, de esta manera:

public class Item { public string Name = "Item"; } public class Subitem : Item { public Subitem() { Name = "Subitem"; } }


Una posible solución sería utilizar una propiedad y anular su captador , de esta manera:

public class Item { public virtual string Name { get { return "Item"; } } } public class Subitem : Item { public override string Name { get { return "Subitem"; } } }