В следующем примере я могу создать виртуальный метод Show()
в унаследованном классе, а затем переопределить его в наследующем классе. сильный> класс.
Я хочу сделать то же самое с защищенной переменной класса prefix
, но получаю сообщение об ошибке:
Модификатор «виртуальный» недействителен для этого предмета.
Но поскольку я не могу определить эту переменную как virtual/override в своих классах, я получаю предупреждение компилятора:
TestOverride234355.SecondaryTransaction.prefix скрывает унаследованный член TestOverride234355.Transaction.prefix. Используйте новое ключевое слово, если предполагалось скрытие.
К счастью, когда я добавляю ключевое слово new
, все работает нормально, и это нормально, поскольку я получаю ту же функциональность, но возникает два вопроса:
Почему я могу использовать virtual/override для методов, но не для защищенных переменных класса?
Какая на самом деле разница между подходом виртуального/переопределения и подходом скрытия с новым, поскольку, по крайней мере, в этом примере они предлагают одинаковую функциональность?
Код:
using System;
namespace TestOverride234355
{
public class Program
{
static void Main(string[] args)
{
Transaction st1 = new Transaction { Name = "name1", State = "state1" };
SecondaryTransaction st2 =
new SecondaryTransaction { Name = "name1", State = "state1" };
Console.WriteLine(st1.Show());
Console.WriteLine(st2.Show());
Console.ReadLine();
}
}
public class Transaction
{
public string Name { get; set; }
public string State { get; set; }
protected string prefix = "Primary";
public virtual string Show()
{
return String.Format("{0}: {1}, {2}", prefix, Name, State);
}
}
public class SecondaryTransaction : Transaction
{
protected new string prefix = "Secondary";
public override string Show()
{
return String.Format("{0}: {1}, {2}", prefix, Name, State);
}
}
}