web-dev-qa-db-fra.com

Comment remplacer, pas masquer, une variable membre (champ) dans une sous-classe C #?

Je veux que cela me dise le nom de ItemA et ItemB. Il doit me dire "Subitem\nSubitem", mais à la place, il me dit "Item\nSubitem". En effet, la variable "Nom" définie dans la classe Subitem est techniquement une variable différente de la variable "Nom" définie dans la classe Item de base. Je souhaite remplacer la variable d'origine par une nouvelle valeur. Je ne comprends pas pourquoi ce n'est pas la chose la plus simple qui soit, étant donné que le travail virtuel et le remplacement fonctionnent parfaitement avec les méthodes. J'ai été complètement incapable de savoir comment en fait remplacer une 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";
    }
}
30
Eagle-Eye

Vous ne pouvez pas remplacer les variables en C #, mais vous pouvez remplacer les propriétés:

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

Une autre approche serait de changer la valeur dans la sous-classe, comme ceci:

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

Il n'y a pas de concept de polymorphisme (c'est ce qui fait que override fait son travail) avec des champs (ce que vous appelez des variables). Ce que vous devez utiliser ici à la place est une propriété.

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

public class SubItem : Item
{
    public override string Name
    {
        get { return "Subitem"; }
    }
}
8
Adam Robinson

Que signifierait "remplacer une variable"?

Une variable est un emplacement nommé dans la mémoire conceptuelle ("conceptuel", car il pourrait s'agir d'un registre, bien que peu probable avec des champs).

Le remplacement d'une méthode remplace un ensemble d'opérations par un autre.

Puisqu'un emplacement nommé en mémoire n'est pas un ensemble d'opérations, comment pouvez-vous le remplacer? Quelles sont les choses qui devraient utiliser cet emplacement nommé en mémoire censé faire?

Si vous souhaitez modifier ce qui est stocké dans la mémoire, faites-le simplement lorsque la classe dérivée est construite:

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

Si vous souhaitez remplacer un ensemble d'opérations, définissez un ensemble d'opérations (une méthode ou une propriété) à remplacer.

5
Jon Hanna

Cette question est relativement ancienne et l'auteur utilisait probablement C # 5.0 ou inférieur. Mais j'avais la même question et suis tombé sur une solution très soignée qui fonctionne avec C # 6.0 et supérieur que je veux partager avec vous:

C # 6. donne la possibilité d'initialiser les propriétés automatiques. On peut donc utiliser juste cela:

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

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

Une solution possible serait d'utiliser une propriété et de remplacer son getter, comme ceci:

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