为什么要使用virtual虚方法(C#应用场景)

由于作者水平有限,如有写得不对的地方,请指正

按照我的习惯,还是先上程序(例子简单,和大部分的书籍的例子差不多),看看运行的结果:

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,这样产品方是不是可以自己随意新增接口方法和接口实现而不会影响到客开。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxy2847225301

测试使用

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值