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智能编译器给我们带来的诸多好 ...
随机推荐
- PMBOK(第六版) PMP备考知识总汇!
记录本人学习PMBOK第六版的学习笔记. 备考知识总汇! PMBOK序章 PMP备考指南之相关事项介绍 PMP备考指南之第一章:引论 PMP备考指南之第二章:项目运作环境 PMP备考指南之第三章:项目 ...
- 经典例题(Python)
经典例题 if嵌套 1.用户输入账号2.用户输入密码3.判断用户的账号是不是alex4.如果账号是alex在继续判断密码是不是alexdsb5.账号和密码都正确提示用户alex就是一个dsb6.如果账 ...
- python学习-69 包装和授权
包装 1.二次加工标准类型(包装) class List(list): def append(self, a_objcet): if type(a_objcet) is str: super().ap ...
- tidb测试环境搭建
tidb ansible 部署方式环境检查过于严格,测试环境往往达不到标准,需调整一些参数才能部署成功. 基于tidb2.0版本需要调整的参数 [tidb@ansible01 tidb-ansible ...
- npm run脚本传参
1. 脚本上有set设置全局变量 "scripts": { "start": "set REACT_APP_BA=12345 &&am ...
- Deep one-class classification
Deep one-class classification 2019-03-17 23:09:59 zpainter 阅读数 1027 收藏 文章标签: 单分类问题异常检测 更多 分类专栏: 论文 ...
- JAVA的枚举基本操作,对原码反码补码的理解及为运算的深入理解,浮点数计算的误差分析
①深入浅出的了解枚举类型 先看一段代码: enum Size{SMALL,MEDIUM,LARGE}; public class EnumTest { public static void main( ...
- Sql Server 根据条件查找多条数据中最大值的详细记录
--(正常效果) select l.* from loadCurveSampling l left join Meter m on l.meter_id=m.Meter_ID --聚合当天最大值数据记 ...
- springboot笔记05——profile多环境配置切换
前言 一个应用程序从开发到上线,往往需要经历几个阶段,例如开发.测试.上线.每个阶段所用到的环境的配置可能都是不一样的,Springboot 应用可以很方便地在各个环境中对配置进行切换.所以,今天主要 ...
- 使用springboot实现一个简单的restful crud——02、dao层单元测试,测试从数据库取数据
接着上一篇,上一篇我们创建了项目.创建了实体类,以及创建了数据库数据.这一篇就写一下Dao层,以及对Dao层进行单元测试,看下能否成功操作数据库数据. Dao EmpDao package com.j ...