Я хочу, чтобы это сообщило мне имя как 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";
}
}
Вы не можете переопределить переменные в 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";
}
}
Возможное решение - использовать свойство и переопределить его геттер , например:
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";
}
}
Если вы хотите переопределить как набор операций, определите набор операций (метод или свойство) для переопределения.