首页 > 其他分享 >接口的扩展。

接口的扩展。

时间:2022-11-27 11:06:45浏览次数:38  
标签:MyTest002 void 扩展 接口 Test01 方法


今天给大家介绍一些有关扩展方法的一些知识,主要讲解一下在C#3.0中使用扩展方法来扩展接口。

  1、扩展方法跟原来类的方法重名时候的处理逻辑

  2、扩展方法的嵌套

  现在我们来看扩展方法使用的第三个场景:使用扩展方法来扩展接口

  应用场景举例:

  我们有时候会发现最初定义的一个接口,在现在环境下,这个接口需要再增加一个函数。有了扩展方法后,我们在这种情况下又多了一种实现的选择。下面以代码来说明这个问题:

以下为引用的内容:
  namespace Hongjun.Guo
  {
  interface MyInterface
  {
  void Test01();
  }
  public class MyClass : MyInterface
  {
  public void Test01()
  {
  Console.WriteLine("Test01");
  }
  }
  static class MyExtensionMethods
  {
  public static void MyTest002(this MyInterface ii)
  {
  ii.Test01();
  }
  }
  }

  调用方法:

以下为引用的内容:
  using Hongjun.Guo;
  static void Main(string[] args)
  {
  MyInterface mm = new MyClass();
  mm.MyTest002();
  Console.ReadLine();
  }

  分析这样做的好处:

  1、如果我们实现 MyInterface 接口的类很多,这些类没有派生关系,这时候我们要在接口上新增一个函数,按照以前的做法,这个接口的实现类有多少个,我们就需要改多少个,使用了扩展方法后,我们只需要改一个地方。减少代码量。如果实现这个接口的类被封装在不同的组件中,一些组件由于其他原因难以修改,这时候用扩展方法来扩展接口真是给我们一剂良药呀;

  2、扩展方法被调用到,前提条件是扩展方法所在的命名空间被使用了。我们如果把接口跟扩展方法放到同一个命名空间,扩展方法需要引用命名空间的问题就可以认为不存在了。因为你要用这个接口,必然会引用这个命名空间。

  3、扩展方法扩展的接口,与你自己实现这个接口的类中自己实现的函数重名时候的问题(这时候也可以简单认为是这个类 override 了这个函数实现)。

  先说结论:这两个不存在冲突问题,你如果是接口调用,则是扩展方法,如果是实现类调用,则是实现类自己的方法,参看我前面博客对扩展方法跟原来类的方法重名时候的处理逻辑的描述,下面再以一段代码来描述这个问题。

以下为引用的内容:
  namespace Hongjun.Guo
  {
  interface MyInterface
  {
  void Test01();
  }
  static class MyExtensionMethods
  {
  public static void MyTest002(this MyInterface ii)
  {
  ii.Test01();
  }
  }
  public class MyClass : MyInterface
  {
  public void Test01()
  {
  Console.WriteLine("Test01");
  }
  public void MyTest002()
  {
  Console.WriteLine("MyTest002");
  }
  }
  }

  调用代码:

以下为引用的内容:
  using Hongjun.Guo;
  static void Main(string[] args)
  {
  MyInterface mm = new MyClass();
  mm.MyTest002();
  Console.WriteLine("***********");
  ((MyClass)mm).MyTest002();
  Console.ReadLine();
  }

  这段代码执行的结果是

  Test01

  ***********

  MyTest002

  分析:

  mm.MyTest002(); 这行代码是接口调用,则使用的是扩展方法。

  ((MyClass)mm).MyTest002(); 这行代码调用者类型是MyClass ,MyClass 实现了MyTest002 函数,则不是扩展方法调用

标签:MyTest002,void,扩展,接口,Test01,方法
From: https://blog.51cto.com/u_15834343/5889825

相关文章

  • string 类的扩展方法
     ​​string类的扩展方法​​string类的扩展方法列表(基本相同于IEnumerable<T>接口的成员列表):Aggregate<>//累加All<>//是否都满......
  • abap-BAPI_MATERIAL_SAVEDATA 扩展字段的使用
    事情原由:需要用jco来调用 BAPI_MATERIAL_SAVEDATA创建物料,但是发现有个可配置栏位,没有地方传入这个bapi.imports和tables里都没办法将这个字段传入,检查了一下......
  • Condition 接口
    Condition接口​ Condition将Object监视方法(wait、notify和notifyAll)分解为不同的对象,通过将它们与任意Lock实现的使用结合起来,实现每个对象具有多个等待集的效果。......
  • 如何扩展 Mac mini 2018 内存条 All In One
    如何扩展Macmini2018内存条AllInOne升级Macmini(2018年)的内存https://support.apple.com/en-us/HT205041#onehttps://support.apple.com/zh-cn/HT205041#on......
  • 快递停发区域查询接口
    通过寄件信息、收件信息,查询快递公司该线路是否支持寄送,减少退回、发货失败等情况,提升用户体验,减少物流成本。请求地址 GET​​https://api.itapi.cn/api/kuaidi/stop​​......
  • 扩展
    01-MySQL主从搭建基于docker02-django项目实现读写分离03-CGI,FastCGI,WSGI,uWSGI,uwsgi一文搞懂04-Rabbitmq入门到精通05-python中使用rpc框架......
  • Pytest接口测试框架实战项目搭建(五)—— Streamlit首次应用
    一、源码,c_page.py'''@Date:2022/11/1414:36@Author:一加一'''importstreamlitasstimportosimportsysBASE_DIR=os.path.dirname(os.path.dirname(os.pa......
  • ES6对象的扩展
    对象中可以直接写变量ES6允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。constfoo='bar';constobj={foo};//key值就是foo,value值是foo变量对应的值//......
  • 【Spring Cloud实战】OpenFeign服务接口调用
    gitee地址:https://gitee.com/javaxiaobear/spring-cloud_study.git在线阅读地址:https://javaxiaobear.gitee.io/1、概述官网:https://docs.spring.io/spring-cloud-openfeig......
  • 【Java】EasyCaptcha 封装验证码接口
     依赖坐标:<dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2......