Как переопределить, а не скрыть переменную-член (поле) в подклассе C#?

Я хочу, чтобы это сказало мне имя как ItemA, так и ItemB. Он должен сказать мне "SubitemnSubitem", но вместо этого он говорит мне"ItemnSubitem". Это связано с тем, что переменная" Name", определенная в классе подэлементов, технически отличается от переменной" Name", определенной в классе базовых элементов. Я хочу изменить исходную переменную новое значение. Я не понимаю, почему это не самая простая вещь, учитывая виртуальную и переопределяющую работу с методами. Я совершенно не в состоянии узнать, как на самом деле переопределить переменной.

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

5 ответов


нельзя переопределить переменные в C#, но вы можете переопределить свойства:

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

другим подходом было бы изменить значение в подклассе, например:

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

нет понятия полиморфизма (что и делает override сделайте свое дело) с полями (то, что вы называете переменными). То, что вам нужно использовать здесь, - это свойство.

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

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

что означает "переопределение переменной"?

переменная-это именованный место в концептуальной памяти ("концептуальные", потому что это может быть регистр, хотя и не очень вероятно, с полями).

переопределение метода заменяет один набор операций другим.

поскольку именованное местоположение в памяти не является набором операций, как вы можете его заменить? Что должны делать вещи, которые ожидают использовать это именованное местоположение в памяти?

Если вы хотите изменить то, что хранится в памяти, тогда просто сделайте это, когда будет построен производный класс:

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

Если вы хотите переопределить как набор операций, определите набор операций (метод или свойство) для переопределения.


этот вопрос относительно стар, и автор, вероятно, использовал C# 5.0 или ниже. Но у меня был тот же вопрос и наткнулся на очень аккуратное решение, которое работает с C# 6.0 и выше, я хочу поделиться с вами:

C# 6.0 дает возможность инициализировать авто-свойства. Так что можно использовать только это:

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

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

возможным решением было бы использовать свойство и переопределить его геттер, например:

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