C# 3.0 扩展方法&接口
namespace ExtensionInterfaceMethod
{
class Program
{
static void Main(string[] args)
{
//使用接口变量来调用扩展方法
IBasicInterface bii = new BasicImplement();
bii.SubStract(, );
}
}
//先创建一个简单的接口
public interface IBasicInterface
{
int Add(int x, int y);
}
//创建一个实现该接口的类
public class BasicImplement : IBasicInterface
{
#region IBasicInterface 成员
public int Add(int x, int y)
{
return x + y;
}
#endregion
}
}
如果想要为该接口IBasicInterface增加一个相减的Subtract方法,在扩展方法中新定义一个Subtract方法。
namespace ExtensionInterfaceMethod
{
public static class ExtensionMethodClass
{
public static int SubStract(this IBasicInterface basicinterface, int x,int y);
}
}
因为是接口扩展方法,所以不打算为这个扩展方法提供任何代码实现。
编译时运行报错,解决方法,在接口扩展方法中实现代码。
namespace ExtensionInterfaceMethod
{
public static class ExtensionMethodClass
{
public static int SubStract(this IBasicInterface basicinterface, int x, int y)
{
//尽管是扩展一个接口,但是还是必须添加对方法的实现
return x - y;
}
}
}
接口扩展方法的调用:
- 使用实现了该接口的类来直接调用扩展方法
BasicImplement bim = new BasicImplement();
bim.SubStract(, );
- 使用接口引用来调用
IBasicInterface bii = new BasicImplement();
bii.SubStract(, );
namespace Extensions
{
using System;
using ExtensionMethodsDemo1; public static class Extension
{
//扩展接口
public static void MethodB(this IMyInterface myInterface);
{
Console.WriteLine("Extension.MethodB(this IMyInterface myInterface)");
}
}
}
namespace ExtensionMethodsDemo1
{
using System;
using Extensions; public interface IMyInterface
{
//void MethodB();
} class A : IMyInterface
{
//public void MethodB() { Console.WriteLine("A.MethodB()"); }
} class B : IMyInterface
{
//public void MethodB() { Console.WriteLine("B.MethodB()"); } }
class C : IMyInterface
{
//public void MethodB() { Console.WriteLine("C.MethodB()"); } } class ExtMethodDemo
{
static void Main(string[] args)
{
IMyInterface a = new A();
IMyInterface b = new B();
IMyInterface c = new C(); a.MethodB();
b.MethodB();
c.MethodB(); Console.ReadLine();
}
}
}
Demo
public interface I飞
{ } public static class 飞接口的扩展
{
public static void 飞<T>(this T 飞实例) where T : I飞
{
Console.WriteLine("准备");
Console.WriteLine("张开双翅");
Console.WriteLine("起飞");
Console.WriteLine("我飞,我飞,我飞飞飞");
}
} public class 老虎
{
public virtual void 自我介绍()
{
Console.WriteLine("大家好,我是老虎。");
}
} public class 苍蝇 : I飞
{
public void 飞一个看看()
{
this.飞();
}
} public class 超级老虎 : 老虎, I飞
{
public override void 自我介绍()
{
Console.WriteLine("大家好,我是超级老虎哦!");
} public void 我会飞哟()
{
this.飞();
}
}
Demo2
C# 3.0 扩展方法&接口的更多相关文章
- C#3.0扩展方法学习篇
什么是类的扩展方法 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. MSDN Extension methods enable you to &q ...
- C#3.0 扩展方法
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual ...
- C# 3.0 扩展方法[转载]
实践 扩展方法是C# 3.0中新加入的特性.MSDN中对扩展方法的定义是:扩展方法使您能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 以下以 ...
- C#3.0新特性之扩展方法介绍
C#3.0扩展方法是给现有类型添加一个方法.现在类型即可是基本数据类型(如int,String等),也可以是自己定义的类.以下是引用片段: //Demo--1 //扩展基本类型 namespace T ...
- C#3.0新增功能04 扩展方法
连载目录 [已更新最新开发文章,点击查看详细] 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型 ...
- C# 9.0新特性详解系列之二:扩展方法GetEnumerator支持foreach循环
1.介绍 我们知道,我们要使一个类型支持foreach循环,就需要这个类型满足下面条件之一: 该类型实例如果实现了下列接口中的其中之一: System.Collections.IEnumerable ...
- [读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法
前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好 ...
- c#扩展方法的理解(二:接口)
namespace ExtensionInterfaceMethod { class Program { static void Main(string[] args) { //使用接口变量来调用扩展 ...
- C#学习笔记四: C#3.0自动属性&匿名属性及扩展方法
前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好 ...
随机推荐
- 1.jvm思维导图
点击图片可查看高清图
- Linux中进行jdk的安装+Tomcat安装+mysql的安装
1.上传所需要的文件(这里事先准备好了jdk和tomcat的安装包,mysql需要在线安装) jdk的安装包名称:jdk-8u151-linux-x64.tar.gz tomcat 的安装包名称:ap ...
- Node模块化
Node.js是一个能够在服务器端运行JavaScript的开放源代码.跨平台JavaScript运行环境.Node是对ES标准一个实现,也是一个JS引擎.与传统服务器不同是Node的服务器是单线程的 ...
- java之struts2的配置讲解(2)
在 java之struts框架入门教程 基础上,进行下列操作 1.结构对比 原来的项目结构图 现在的结构图 即从结构上可以看出,在HelloStruts项目中增加了config 文件夹(Source ...
- Ado.Net查询语句使用临时表做条件
using System; using System.Data; using System.Data.SqlClient; using System.Text; namespace WindowsFo ...
- nlp-roadmap
nlp-roadmap https://github.com/graykode/nlp-roadmap nlp-roadmap is Natural Language Processing ROADM ...
- vi / vim 基本操作
进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi n filename :打开文件,并将光标置于第n行首 vi filename :打开 ...
- C++创建和使用动态链接库
一个简单的动态链接库的生成和调用例子,太过简单,大神请绕道. 一.创建动态链接库 使用vs创建工程选择动态链接库. 在项目中创建源文件和头文件,并在文件中添加以下代码. 在头文件中添加以下代码 // ...
- ARM的Semihosting技术(转)
Semihosting技术将应用程序中的IO请求通过一定的通道传送到主机(host),由主机上的资源响应应用程序的IO请求, 而不是像在主机上执行本地应用程序一样,由应用程序所在的计算机响应应用程序I ...
- (多核DSP快速入门)SYS/BIOS入门
(多核DSP快速入门)SYS/BIOS入门 原创文章 转载请注册来源http://blog.csdn.net/tostq 系列教程目录:http://blog.csdn.net/tostq/art ...