Как переопределить, а не скрыть переменную-член (поле) в подклассе 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"; } }
}