В следующем примере я могу создать виртуальный метод Show()
в классе наследуемый, а затем переопределить его в наследующий класс.
Я хочу сделать ту же самую вещь с защищенной переменной класса prefix
, но я получаю ошибку:
Модификатор "virtual" недействителен для этого элемента
Но поскольку я не могу определить эту переменную как virtual/override в моих классах, я получаю компилятор warning:
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);
}
}
}