【C#开发】 C#接口使用小结(持续更新)
C#的接口(interface)
早些时候我认识的接口仅仅只是作为一个方法签名来使用但是随着学习的深入,就我感觉而言,我所认识的接口又越来越像一个抽象类了
1.最基本的使用
作为一个接口提供公共方法接下来用玩家的交互判断来举一个例子吧!
接口也支持使用泛型
再举一个手动实现拷贝方法的接口为例子
另外C#中,接口(interface)中的方法默认是public的。如果你不指定任何访问修饰符,接口中的方法隐式地是public。
2.接口上使用属性
接口中的属性定义类似于方法的定义接口属性不包含访问器的实现,而是只声明属性的存在
实现接口的类必须提供这些属性的实现。
不难猜到这个用法,毕竟CSharp属性的本质就是函数的语法糖
例如:
public Name {get;set;} = "";
//如果Name属性在类里面将会自动生成一个隐藏字段供Name使用
//但是继承了接口里属性就得自己手动实现
3.接口上使用事件
在接口中定义事件类似于定义方法和属性接口仅声明事件,不包含事件的实现
实现接口的类必须提供这些事件的实现。
4.接口上默认实现
C#8.0开始,接口支持了默认实现使得接口不仅仅是方法签名的集合
还可以提供实际的方法实现
接口默认实现的引入使得接口的演变更加灵活,同时可以减少破坏性更改
接下来以一个包含默认方法Fun的接口来举例
但是你会发现并不能直接使用
需要将该对象显式转换成接口才能使用
但我推荐这样使用
编写一个参数类型为接口的函数
然后对象就会在传参的过程中被直接显式转换
(类似spring框架的依赖注入升级版)
但注意!
如果在实现类里"重写"了默认方法
那么原来的默认方法将会被彻底覆盖
5.接口上显式实现
(其实这个应该放在前面一点讲比较好显式接口实现用于解决接口成员命名冲突或隐藏接口成员
使得这些成员只能通过接口引用来访问
怎么去显式实现接口呢?
比如我们在实现接口方法的前面加上"接口."就是显式实现接口的方法
显式实现接口不能使用修饰符来修饰(即使是public也不行)
因为显式实现的成员在类的实例上是不可见的
这意味着这些成员没有明确的访问级别
它们的访问是通过接口引用来控制的
如果允许显式实现的方法加上修饰符会引入混淆
因为显式实现的初衷是让这些方法通过接口引用来访问,而不是通过类实例直接访问。
和前面的默认实现方法一样
并不能直接通过对象来使用该方法
需要通过显式转换才可以
那这时候你就会问了
他的使用场景是什么?
比如定义一个实体接口(IEntity)
他有两种通用方法,一种攻击(Damage),一种被攻击(Damaged)
现在我想创建一种新的实体叫稻草人(Scarecrow)
它不能攻击,只能被攻击
聪明的你就想到了,我们可以利用显式实现
以一种规范的角度来"隐藏"Damage方法
这样就能让外部不能调用他不该有的Damage方法
6.多个接口的同名方法或属性的处理
参考前面接口的显式实现和显式转换成接口当一个类实现多个接口且这些接口包含同名的属性或方法时
可以通过显式接口实现来解决命名冲突
这种方式允许一个类为每个接口提供单独的实现,从而避免冲突和歧义
如果一个类实现了两个带有相同名称的属性或方法时
可以像下面这样处理
类似于命名空间的引用,接口.属性
但需要注意的是,照上一章的例子来看
自己在实现类"重写"过一个Num属性之后应该也会被覆盖(其实就是混合实现
但实际却仍然能被正确地访问
当然,反正都是同名属性
直接实现一个属性而不去针对每个接口去实现属性也是可以的
不过如果两个接口的属性访问器不同
就得取两个访问器的并集