非虚模式的是将调用接口与实际执行函数分离,调用接口不支持继承(没有多态功能),而将实现多态的功能交给具体的保护性执行函数,这样就使得调用接口统一,同时不损失多态的好处。具体做法如下:
/// <summary>
/// 基类
/// </summary>
public class Base
{
/// <summary>
/// 对外公布的接口,注意这里不采用虚方法,主要是为了控制统一调用入口。
/// 相当于真正所调用的方法的代理方法。
/// </summary>
public void DoWork()
{
//这种模式的好处就是你可以在这个方法添加很多附加的行为。
//在很多时候,可以作为增加行为的一种方式.
CoreDoWork();
}
/// <summary>
/// 实际的工作代码方法,虚拟的,而且是保护的,故可以实现多态,而外部不能调用,就使得调用接口保持统一.
/// </summary>
protected virtual void CoreDoWork()
{
Console.WriteLine("Base.DoWork()");
}
}
public class Derived : Base
{
/// <summary>
/// 重写基类方法.
/// </summary>
protected override void CoreDoWork()
{
Console.WriteLine("Derived.DoWork()");
}
}
/// <summary>
/// 调用示例..
/// </summary>
public class EntryPoint
{
static void Main()
{
Base b = new Derived();
b.DoWork();
}
}
这种模式的好处是既可以实现多态,同时还可以在代理方法处增加额外的行为,而且这种行为影响所有的调用。
而虚方法无法实现这种既增加额外的行为又影响所有调用的能力。
这种方式在有些时候可以作为面向方面编程(AOP)的一种实现方式,特别是哪些无中间语言生成的时候.。