c#接口是什么,为什么要用接口

你是任天堂的老总,为了扩大营销,你做了一个活动。
活动期间内消费满一千元可以得到一个金手指。
金手指可以修改游戏数据。
本期活动的金手指效果是:回血。

在游戏中的生命值有各式各样的,像马里奥这种一个一个的,像星之卡比这种一格一格的。
像英雄联盟这样的条状血,像时命召唤这样的呼吸回血。

不用接口如何处理以下问题

1.如何不区分类型

现在你有两个游戏产品,一个条状血,一个格子血。

class 探险王
{
	public int Hp = 50;
	public int MaxHp = 100;

	public void 回血()
	{
		Hp = MaxHp;
	}
}
class 猫里奥
{
	public int Hp = 3;
	public void 回血()
	{
		Hp++;
	}
}

那么你如何执行这个金手指的回血效果呢?
新手的第一反应肯定是直接调用。

class 金手指
{ 
	public static void 执行回血(探险王 game) { game.回血(); }
	public static void 执行回血(猫里奥 game) { game.回血(); } 
}

你这样写,当然是可以运行的。
但是有什么问题存在呢?
为什么你要写两个重载?
因为这里发布了两款游戏。你发售多少款游戏就要写多少个重载。
那你打算写一千个重载?

而且第二个问题是如何更新。
任天堂的产品是现实物品。他们如果要更新就要把东西寄回去。
那如果这样的营销活动出了12期,你打算让别人每个月来来回回给你寄回12次产品?

反射是一种解决方案,虽然这不是新手内容。
利用反射,调用这个类型里名为回血的方法。这样就可以不区分具体类型。

class 金手指
{
	public static void 执行回血(object game)
	{
		Type type = game.GetType();
		var m = type.GetMethod("回血");
		m.Invoke(game, Array.Empty<object>());
	}
}

2.如何知道你要执行哪个方法

有一天,你找了一个外包厂家,让他们帮你完成剩余内容。
他们知道你有一个金手指,需要写一个回血方法。
但是他们下意识地,加上了金手指的名字。

class 探险王2辉煌大陆
{
	public int Hp = 50;
	public int MaxHp = 100;

	public void _2019期金手指_回血()
	{
		Hp = MaxHp;
	}
}

反射找不到名为“回血”的方法,于是就报错了。

3.如何知道这个类是不是支持你要做的事

有一天,一个人把这个回血金手指。插到了三星学习机上。
巧了,这个学习机也有一个回血方法。

class 三星学习机
{
	public void 回血()
	{
		Console.WriteLine("这个词读作:hui xue");
	}
}

接口如何解决上述问题

首先制作回血接口,并让探险王和猫里奥实现他

interface I回血
{
	public void 回血();
}
class 探险王 : I回血
{
	public int Hp = 50;
	public int MaxHp = 100;

	public void 回血()
	{
		Hp = MaxHp;
	}
}
class 猫里奥 : I回血
{
	public int Hp = 3;
	public void 回血()
	{
		Hp++;
	}
}

1.不区分类型

接口可以进行类型转换

探险王 tan = new 探险王();
I回血 Itan = tan;

而方法的参数也是一个变量,也是可以做类型转换的。

class 金手指
{
	public static void 执行回血(I回血 game)
	{
		game.回血();
	}
}

调用的时候就直接传入进入

探险王 tan = new 探险王();
猫里奥 mao = new 猫里奥();

金手指.执行回血(tan);
金手指.执行回血(mao);

2.指示执行哪个方法

外包厂家拿到了你的接口类型,继承了你的接口。
并且告诉接口:如果你要执行回血的话,执行_2019期金手指_回血

class 探险王2辉煌大陆 : I回血
{
	public int Hp = 50;
	public int MaxHp = 100;

	public void _2019期金手指_回血()
	{
		Hp = MaxHp;
	}

	void I回血.回血() => _2019期金手指_回血();
}

3.如何知道是否支持

如果一个类不继承接口,那他当然是无法进行类型转换的。
在这里插入图片描述

4.如果要新增支持的类

那么你只需要把这个类在制作时支持接口就行了。

而你已经分发出去的金手指,从制作完成到落入历史的垃圾堆,
都不需要再改变他了。

class 金手指
{
	public static void 执行回血(I回血 game)
	{
		game.回血();
	}
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值