c#使用扩展方法,实现对接口的扩展

扩展方法实现对接口扩展

在使用面向对象的语言进行项目开发的过程中,我们会较多的会使用到定义接口、继承等方式,来减少常用的操作。但是并非所有的场景都适合使用“继承”特性。

继承带来的问题,对象的继承关系在运行时就已经定义好了,子类的实现与它父类有非常紧密的依赖关系,以至于在修改父类的情况下,会影响到相关继承父类的子类。

c#3.0扩展方法

  • 扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的
  • 必须携带一个参数,参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀
  • 只能是访问所扩展类的public成员

实例

 1     /*定义组装汽车*/
 2     interface ICar
 3     {
 4         //定义车身
 5         string Frame();
 6         //定义车灯
 7         string CarLight();
 8         //定义座椅
 9         string Chair();
10         //定义轮子
11         string Wheel();
12         //定义方向盘
13         string SteeringWheel();
14     }
 1     public class Benz : ICar
 2     {
 3         /*继承父类*/
 4         public string CarLight()
 5         {
 6             return "安装奔驰车灯";
 7         }
 8
 9         public string Chair()
10         {
11             return "安装奔驰座椅";
12         }
13
14         public string Frame()
15         {
16             return "设计车身结构";
17         }
18
19         public string SteeringWheel()
20         {
21             return "安装奔驰方向盘";
22         }
23
24         public string Wheel()
25         {
26             return "安装奔驰轮子";
27         }
28     }
 1 public class Ferrari : ICar
 2     {
 3         /*继承父类*/
 4         public string CarLight()
 5         {
 6             return "安装法拉利车灯";
 7         }
 8
 9         public string Chair()
10         {
11             return "安装法拉利座椅";
12         }
13
14         public string Frame()
15         {
16             return "设计车身结构";
17         }
18
19         public string SteeringWheel()
20         {
21             return "安装法拉利方向盘";
22         }
23
24         public string Wheel()
25         {
26             return "安装法拉利轮子";
27         }
28     }

调用例子

 1 private void btnBenz_Click(object sender, EventArgs e)
 2         {
 3             ICar benz = new Benz();
 4             listBox1.Items.Add("工人1号正在安装奔驰!");
 5             listBox1.Items.Add(benz.Frame());
 6             listBox1.Items.Add(benz.Wheel());
 7             listBox1.Items.Add(benz.SteeringWheel());
 8             listBox1.Items.Add(benz.Chair());
 9             listBox1.Items.Add(benz.CarLight());
10         }
11
12         private void btnFerrari_Click(object sender, EventArgs e)
13         {
14             ICar ferrari = new Ferrari();
15             listBox1.Items.Add("工人2号号正在安装法拉利!");
16             listBox1.Items.Add(ferrari.Frame());
17             listBox1.Items.Add(ferrari.Wheel());
18             listBox1.Items.Add(ferrari.SteeringWheel());
19             listBox1.Items.Add(ferrari.Chair());
20             listBox1.Items.Add(ferrari.CarLight());
21         }

以上完成一个简单的子类继承父类,实现父类定义的接口方法

现在我新安装一辆大众CC,并需要加装一个天窗,这时候我们就需要调整父类,添加天窗的接口定义

 1 /*定义组装汽车*/
 2     interface ICar
 3     {
 4         //定义车身
 5         string Frame();
 6         //定义车灯
 7         string CarLight();
 8         //定义座椅
 9         string Chair();
10         //定义轮子
11         string Wheel();
12         //定义方向盘
13         string SteeringWheel();
14
15         /*定义新接口,添加天窗*/
16         string SkyLight();
17     }

这样就会产生以下问题,由于我们的Benz和Ferrari不需要天窗,但是又在父类定义了天窗的接口,从而导致Benz和Ferrari,都需要实现天窗的接口,明显不符合客户需求,应该怎么办?

这时候我们可以是要扩展方法,结合上列扩展方法的概述,我们对结构进行调整

安装大众CC

 1  public class VolkswagenCC : ICar
 2     {
 3         /*继承父类*/
 4         public string CarLight()
 5         {
 6             return "安装大众CC车灯";
 7         }
 8
 9         public string Chair()
10         {
11             return "安装大众CC座椅";
12         }
13
14         public string Frame()
15         {
16             return "设计车身结构";
17         }
18
19         public string SteeringWheel()
20         {
21             return "安装大众CC方向盘";
22         }
23
24         public string Wheel()
25         {
26             return "安装大众CC轮子";
27         }
28     }

扩展大众CC天窗方法

1 public static class CCExtend
2 {
3      public static string SkyLight(this ICar ii)
4       {
5           return "安装大众CC天窗";
6        }
7  }

完成大众CC天窗安装

 1 private void btnCC_Click(object sender, EventArgs e)
 2 {
 3      ICar CC = new VolkswagenCC();
 4      listBox1.Items.Add("工人3号正在安装法拉利!");
 5      listBox1.Items.Add(CC.Frame());
 6      listBox1.Items.Add(CC.Wheel());
 7      listBox1.Items.Add(CC.SteeringWheel());
 8      listBox1.Items.Add(CC.Chair());
 9      listBox1.Items.Add(CC.CarLight());
10      listBox1.Items.Add(CC.SkyLight());
11 }

最终实现效果

2018-03-05 23:32:02

原文地址:https://www.cnblogs.com/YHeng/p/8510446.html

时间: 2024-10-17 20:59:04

c#使用扩展方法,实现对接口的扩展的相关文章

C#扫盲之:带你掌握C#的扩展方法、以及探讨扩展方法的本质、注意事项

1.为什么需要扩展方法 .NET3.5给我们提供了扩展方法的概念,它的功能是在不修改要添加类型的原有结构时,允许你为类或结构添加新方法. 思考:那么究竟为什么需要扩展方法呢,为什么不直接修改原有类型呢? 首先,假设我们的项目中有一个类,后来过了一段时间,我们明确的知道需要为该类添加一个新功能,考虑这个需求有两个解决办法: (1)直接修改当前类的定义 这样做的缺点是,破坏向后的兼容性,可能以前使用的旧代码无法通过编译.比如说旧代码使用了一个Methed(int,int)的方法,但是为了满足新功能我

【转载】C#扫盲之:带你掌握C#的扩展方法、以及探讨扩展方法的本质、注意事项

1.为什么需要扩展方法 .NET3.5给我们提供了扩展方法的概念,它的功能是在不修改要添加类型的原有结构时,允许你为类或结构添加新方法. 思考:那么究竟为什么需要扩展方法呢,为什么不直接修改原有类型呢? 首先,假设我们的项目中有一个类,后来过了一段时间,我们明确的知道需要为该类添加一个新功能,考虑这个需求有两个解决办法: (1)直接修改当前类的定义 这样做的缺点是,破坏向后的兼容性,可能以前使用的旧代码无法通过编译.比如说旧代码使用了一个Methed(int,int)的方法,但是为了满足新功能我

字符串转数字扩展方法、字符串处理扩展方法

写代码时喜欢连贯的.链式的写下去,而不是光标再返回到前面写类型转换等等. 自定义了些字符串扩展方法: 1 /// <summary> 2 /// 字符串操作扩展方法类 3 /// </summary> 4 public static class StringOperationExtensions 5 { 6 /// <summary> 7 /// 若输入字符串为null,则返回String.Empty. 8 /// </summary> 9 /// <

C#的扩展方法解析

在使用面向对象的语言进行项目开发的过程中,较多的会使用到"继承"的特性,但是并非所有的场景都适合使用"继承"特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继承关系实在编译时就定义好了,所以无法在运行时改变从父类继承的实现.子类的实现与它父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化.当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写它或被其他更适合的类替换,这种依赖关系限制

Entity Framework DbSet&lt;T&gt;之Include方法与IQueryable&lt;T&gt;扩展方法Include的使用

Entity Framework使用Code First方式时,实体之间已经配置好关系,根据实际情况某些情况下需要同时获取导航属性,比如获取商品的同时需要获取分类属性(导航属性),或者基于优化方面考虑等,下面来看一个例子 例子中有会员实体类(Member)与角色实体类(Role),Role与Member的关系是1:n,控制台应用程序代码如下: using System; using System.Collections.Generic; using System.Linq; using Syst

使类的扩展更简单——扩展方法

1.什么是扩展方法? 扩展方法,首先是一种方法,它可以用来扩展已定义类型中的方法成员. 在扩展方法诞生之前,如果想为一个已有类型自定义含有特殊逻辑的新方法时,你必须重新定义一个类型来继承已有类型,以这种方式来添加方法.如果基类有抽象方法,则还要重新去实现这个抽象方法. 这样,为了扩展一个方法,需要承担更多的因继承而产生的开销.使用继承来扩展现有类型总有点大材小用的感觉,并且值类型或密封类(不能被继承的类)等也不能被继承,不能由此获得扩展. 于是,C#3.0提出了扩展方法. 2.扩展方法的使用 2

[读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法

前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好处, 下一遍会单独介绍Lambda表达式. 这篇主要包括的内容有: 自动属性,隐式类型,对象集合初始化,匿名类型,扩展方法. 下面一起来看下C#3.0 所带来的变化吧. 1,自动实现的属性在C#3.0之前, 定义属性时一般会像下面这样去编写代码: 1 class Person 2 { 3 //定义私

C# 3.0 特性之扩展方法

今天,我们来聊一聊C#的扩展方法. C# 3.0中为我们提供了一个新的特性—扩展方法.什么是扩展方法呢?我们看一下MSDN的注解: 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型 也就是说,我们可以为基础数据类型,如:String,Int,DataRow,DataTable等添加扩展方法,也可以为自定义类添加扩展方法. 那么,我们怎么向现有类型进行扩展呢?我们再看看MSDN的定义: 扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的.

Jquery 扩展方法

$.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效. 如扩展$.fn.abc() 那么你可以这样子:$("#div").abc(); 通常使用extend方法扩展,详细请看API. $.fx是指jquery的特效. 如果使用显示.滑动.淡入淡出.动画等. $.fx.off可以关闭动画,其实是直接显示结果. -----------------------------------------------------------------------