由于作者水平有限,如有写得不对的地方,请指正
按照我的习惯,还是先上程序(例子简单,和大部分的书籍的例子差不多),看看运行的结果:
class Program
{
/**
* IAudioApi和AudioApiCommon:由基版代码方或者第三方提供
* AudioApiClient:由客开自己实现
*/
static void Main(string[] args)
{
IAudioApi api = new AudioApiClient(); //可以通过反射的方式获取到接口实例
api.Method_A(); //这样基版代码方或者第三方自己可以定义属于自己的部分方法,而且接口和实现类都由他们那边控制
api.Method_New(); //这样客开重新new改写的方法不生效
api.Method_Override(); //客开的方法生效
Console.WriteLine("---");
AudioApiCommon common = api as AudioApiCommon;
common.Method_New();
common.Method_Override();
Console.WriteLine("---");
api.Method_New();
api.Method_Override();
Console.WriteLine("---");
IAudioApi api1 = new AudioApiCommon();
api1.Method_Override();
Console.ReadKey();
}
}
public interface IAudioApi
{
void Method_A();
void Method_New();
void Method_Override(); //接口中不能加virtual
}
public class AudioApiCommon: IAudioApi
{
public void Method_A()
{
Console.WriteLine("Common_A");
}
public void Method_New()
{
Console.WriteLine("Common.New");
}
public virtual void Method_Override()
{
Console.WriteLine("Common.Overiride");
}
}
public class AudioApiClient : AudioApiCommon
{
new public void Method_New()
{
Console.WriteLine("Client.new");
}
public override void Method_Override()
{
Console.WriteLine("Client.Overiride");
}
}
输出结果:
其实我想要描述的是分层的思想,代码中的IAudioApi和AudioApiCommon一般由基版代码方或者第三方通过dll的方式提供,我这里为了简单演示,就放到一起了。基版代码方有可能和你同一个公司,即使是同一个公司,对于核心的代码,你也不一定有查看和修改代码的权限。
做个简单的规定:
以下描述的
"产品方"指基版代码方或者第三方
"客开"是指我们客户端开发
1 Main方法的第一行:IAudioApi api = new AudioApiClient(),这里的new AudioApiClient()通过反射来获取到对应的实例,而不像我这样直接new。
2 接口IAudioApi和实现AudioApiCommon都由产品方处理好提供给客开,客开AudioApiClient要继承产品方的实现类AudioApiCommon,并根据需要override产品方AudioApiCommon对应的方法并配置反射(接口IAudioApi的实现类为AudioApiClient),至于你客开override成什么鬼样,产品方可以不管。产品方通过接口IAudioApi回调实现对应的功能,就好像AudioApiCommon类的Method_A,再看看主程序Main方法的第二行api.Method_A()的输出"Common_A",但我new的明明是客开的AudioApiClient,产品方通过接口IAudioApi却能接口回调调用到产品实现类AudioApiCommon的Method_A,这样产品方是不是可以自己随意新增接口方法和接口实现而不会影响到客开。