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

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

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";
    }
}
28
задан Eagle-Eye 13 January 2012 в 01:14
поделиться

3 ответа

Вы не можете переопределить переменные в 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";
    }
}
39
ответ дан 28 November 2019 в 03:04
поделиться

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

public class Item
{
    public virtual string Name { get { return "Item"; } }
}
public class Subitem : Item
{
    public override string Name { get { return "Subitem"; } }
}
1
ответ дан 28 November 2019 в 03:04
поделиться

Что будет означать «переопределение переменной»?

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

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

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

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

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

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

5
ответ дан 28 November 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: