В вашем примере, если вы не переопределите «Show» в классе SecondaryTransaction, то вызов Show для экземпляра SecondaryTransaction фактически вызовет метод в базовом классе (Transaction), который, следовательно, будет использовать «Show» в базовом классе, в результате чего получается:
Primary: name1, state1
Primary: name1, state1
Таким образом, в зависимости от того, какой метод вы вызываете (т. Е. Один для базового класса или дочернего класса), код будет иметь другое значение для «префикса», что будет обслуживаемостью кошмар . Я подозреваю, что вы, вероятно, хотите / должны сделать, выставить свойство в транзакции, которое заключает в себе «префикс».
Вы не можете переопределить поле, потому что это деталь реализации базового класса. Вы можете изменить значение защищенного поля, но, переопределив его, вы, по сути, скажете, что я хочу заменить поле , а не значение .
Что бы я сделал (если бы я абсолютно не хотел / не мог использовать свойства):
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
{
public SecondaryTransaction()
{
prefix = "Secondary";
}
public override string Show()
{
return String.Format("{0}: {1}, {2}", prefix, Name, State);
}
}
Редактировать: (согласно моему комментарию к другому ответу)
Если вы вызываете ctor вашего базового класса и вам нужно установить значение, вам, вероятно, придется изменить Transaction, возможно, так:
public class Transaction
{
public string Name { get; set; }
public string State { get; set; }
protected string prefix = "Primary";
// Declared as virtual ratther than abstract to avoid having to implement "TransactionBase"
protected virtual void Initialise()
{ }
public Transaction()
{
Initialise();
}
public virtual string Show()
{
return String.Format("{0}: {1}, {2}", prefix, Name, State);
}
}
public class SecondaryTransaction : Transaction
{
protected override void Initialise()
{
prefix = "Secondary";
}
public override string Show()
{
return String.Format("{0}: {1}, {2}", prefix, Name, State);
}
}