Ответ (который я знаю, не то, что вы ищете):
class SpecialDerived : Base
{
public override void Say()
{
Console.WriteLine("Called from Special Derived.");
base.Say();
}
}
По правде говоря, у вас есть только прямое взаимодействие с классом, от которого вы наследуете. Думайте об этом классе как о слое - обеспечивающем столько же или меньше возможностей его или его родителя, сколько он желает своим производным классам.
EDIT:
Ваше редактирование работает, но я думаю, я бы использовал что-то вроде этого:
class Derived : Base
{
protected bool _useBaseSay = false;
public override void Say()
{
if(this._useBaseSay)
base.Say();
else
Console.WriteLine("Called from Derived");
}
}
Конечно, в реальной реализации вы могли бы сделать что-то более подобное для расширяемости и удобства обслуживания:
class Derived : Base
{
protected enum Mode
{
Standard,
BaseFunctionality,
Verbose
//etc
}
protected Mode Mode
{
get; set;
}
public override void Say()
{
if(this.Mode == Mode.BaseFunctionality)
base.Say();
else
Console.WriteLine("Called from Derived");
}
}
Затем производные классы могут соответствующим образом контролировать состояние своих родителей.