小言_互联网的博客

C# 扩展方法

252人阅读  评论(0)

今天我们学习C#的扩展方法

我们编程中常用构造方法,虚方法,抽象方法,偶尔可能还会用到析构函数,但什么是扩展方法呢?


扩展方法的作用
扩展方法的作用,当我们需要修改底层接口,给它多增加一些功能,但是接口继承之后是一定要实现的,可能会对我们上层的代码影响比较大.又或者我们需要使用到一个密封类,但是它功能不够了,我们不能继承密封类,又想用怎么办呢,也可以用扩展方法来解决问题.

听起来是不是特别厉害,但是实现扩展方法其实不难,我们用代码结合现实例子来解释扩展方法

扩展接口

	/// 定义一个学习接口
	public interface IStudy{
   
		/// 语文
		void Chinese();
		/// 数学
		void Math();
		/// 英语
		void English();
	}
	//这三个课程是基础,每个阶段都要学习的,不会变,所以我把它们放在我们接口里面

在小学的时候,我们这三门课程是够用的

	/// 小学
	public class PrimarySchool:IStudy{
   
		public void Chinese(){
   };
		public void Math(){
   };
		public void English(){
   };
	}
	

初中我们除了基础的语数外,还要学习物理化学这些课程,但是我们如果给学习接口里面添加物理化学,小学必须实现这个也不合理.那怎么办呢

	/// 初中
	public class JuniorHighSchool:IStudy{
   
		public void Chinese(){
   };
		public void Math(){
   };
		public void English(){
   };
	}

这个时候我们可以用扩展方法来解决这个问题
使用扩展需要先定义一个静态类

	/// 学习扩展类
	public static class IStudyExtend{
   
		//物理
		public static void Physics(this IStudy istudy){
   };
		//化学
		public static void Chemistry(this IStudy istudy){
   };
		//扩展一个带参的函数
		public static void WithParam(this IStudy istudy,int param){
   };
	}

这个时候,我们的学习接口中也拥有量物理和化学的课程,继承IStudy接口我们发现,我们还是只需要实现基础的语数外三个函数就好了,但是我们却可以调用物理和化学的函数,因为他们被扩展了.这样初中就可以学习它对应的课程.
后续我们多了新的课程,也可以在扩展类中添加,不用去动底层的接口

注意:接口扩展,函数不强制实现

扩展密封类

为什么要扩展密封类?
当我们需要使用一个底层类,但是它的功能不够,我们想继承它,然后用子类实现某些方法,但是发现这个底层类是密封的,怎么办呢?又不能继承,但是我们还想用.
这个时候我们就可以使用扩展方法来实现我们的需求
实现方式和扩展接口是一样的

	///这是我们的一个管家
	public sealed class Steward{
   
		//开车
		public void Drive(){
   };
		//做饭
		public void Cook(){
   };
		//跳舞
		public void Dance(){
   };
	}

我们请了一个管家,技能比较多样,会开车,做饭,跳舞,但是我们还想让管家会武功怎么办呢

	//学徒
	public class Apprentice:Steward{
   
		public void KongFu(){
   };
	}

我们想请一个会武功的学徒,传承管家的其它技能,也满足了我们的需求,但是管家不愿意啊,你学徒都会了,我就没有用了,不愿意教授学徒.

	//管家培训机构
	public static class StewardExtend{
   
		public static void KongFu(this Steward steward)
	}

这个时候呢,我们找到了一本和死亡笔记一样神奇的书,我们把管家的名字写上去,再把我们想要的技能写上去,管家就会功夫了,我们就可以不用请学徒了,一份工资让管家打四份工

个人理解,如果发现错误,欢迎大佬随时指正😊


转载:https://blog.csdn.net/Liu_ChangC/article/details/117285699
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场