本篇介绍结构体
先看看【C#文档——结构体】中的定义吧
接口包含非抽象 class 或 struct 必须实现的一组相关功能的定义。
按照接口的定义,我们可以得出接口的作用
而在C#中,我们在实例化一个对象的时候可以通过接口来持有它
这样做的好处是,我们只需要关注当前需要关注的属性与行为
所以我们可以将接口的作用再完善一下
一个类或结构体可以继承多个接口,且必须实现接口
而实现方式有两种
一种是我们常用的接口的隐式实现
例如
public interface ICanRun{
public void Run();
}
public class Cat : ICanRun{
public void Run(){
//具体逻辑
//...
}
}
还有一种是我们不常见的接口的显式实现
public interface ICanRun{
public void Run();
}
public class Cat : ICanRun{
public void ICanRun.Run(){
//具体逻辑
//...
}
}
以上两种方式都可以实现一个接口
那么这两种有什么区别呢?
按照官方的说法是
接口的显示实现可以解决接口方法可能重名的问题
然而事情并没有表面上这么简单
接口的显示实现还有许多妙用
首先我们需要知道:
当一个接口方法为显示实现时,需要通过以这个接口类型来调用
举个例子
//当显示实现了ICanRun中的Run()时,这样写是错误的
Cat pipi = new Cat();
pipi.Run();
//不论是否显示实现,这样写都是正确的
ICanRun pipi = new Cat();
pipi.Run();
通过以上两个例子,我们可以总结接口显示实现的特殊用途:
上面两个用途,其实都属于同一个特点,只是用途不同而已
对我来说,接口最大的作用是设计
而设计中,会有一些不希望使用者关注的内容
会使用到显示实现达到阉割接口的目的
具体使用上,我会设计多个包含单一功能的接口
而设计类的时候,我会为这个类专门定义一个接口并继承多个拥有单一功能的接口
在不需要关注的接口上使用显示实现