Как переопределить, а не скрывать переменную-член (поле) в подклассе С#?
Я хочу, чтобы это сообщило мне имя как 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";
}
}
Ответы
Ответ 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"; } }
}