Подтвердить что ты не робот

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

Я хочу, чтобы это сообщило мне имя как ItemA, так и ItemB. Он должен сказать мне "Subitem\nSubitem", но вместо этого он сообщает мне "Item\nSubitem". Это связано с тем, что переменная "Имя", определенная в классе Subitem, представляет собой технически другую переменную, чем переменная "Имя", определенная в базовом классе Item. Я хочу изменить исходную переменную на новое значение. Я не понимаю, почему это не самая легкая вещь, когда вы считаете, что виртуальная и переопределенная работа отлично работает с методами. Я полностью не смог узнать, как фактически переопределить переменную.

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

Ответ 1

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

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

Ответ 2

Нет понятия полиморфизма (что делает override делать свою вещь) с полями (то, что вы называете переменными). Здесь вам нужно использовать свойство.

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

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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