接口关键字:interface
接口的定义:是指一组函数成员而不实现成员的引用类型,其他类型和接口可以继承接口。
接口的特点:
- 通过接口可以实现多重继承,c#接口的成员不能包含public、protected、internal、private等修饰符。原因是很简单的,因为接口里面的方法都需要外面的接口是实现方法体,那么修饰符必然是public。c#接口中的成员默认是public的。
- 接口成员不能有new、static、abstract、override、virtual修饰符。但是有一点要注意的是*当一个接口实现一个接口,两个接口有同样的方法时,可以用new关键字用来隐藏父接口中的方法*。
- 接口中只包含成员的签名,接口中没有构造函数,所以不能直接使用new关键字对接后实例化。接口中只能包含方法的属性、事件和索引的组合。接口一旦被实现,实现类必须实现接口中的所有成员,除非实现类本身是抽象类。
- c#是单继承,接口是结局也c#里面类可以同时竭诚多个基类的问题。
- 接口是一个规范,能力,为了多态,接口不能被实例化,用interface;接口不允许包含字段。方法体,可以写自动属性
- 接口可以继承接口,不能继承一个类
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
public class interfaceTest : MonoBehaviour {
private void Awake()
{
//在c#中COM接口是可以实例化的,但其实这种写法是使接口“映射”到某一个类中
//实际上是创建这个类的实例
IWorker i = new IWorker();
//从这个例子我们很好地理解了接口的好处,如果又来一个新的工作者
//如果不采用接口,每个员工就需要有一个单独的类,这样就很容易出错
//如果又接口这种协议约束的话,那么要实现接口就肯定有接口中声明的方法,我们只需要拿来调用就好了
IWorker worker = new Jame1();
IWorker worker2 = new Jame2();
worker.work("设计");
worker2.work("程序");
}
}
//工作者接口
//ComImport特性发生在tlbimp.exe导入COM类型类库的时候,生成的托管类型会标记有ComImport特性
//Guid特性是一个GUID标识,COM类型是用GUID来标识的。
[ComImport, CoClass(typeof(Jame1))]
[Guid("d60908eb-fd5a-4d3c-9392-8646fcd1edce")]
public interface IWorker
{
void work(string a);
}
class Jame1 : IWorker
{
public void work (string s)
{
Debug.Log("我的名字是Jame1,我的工作是" + s);
}
}
class Jame2 : IWorker
{
public void work (string s)
{
Debug.Log("我的名字是Jame2,我的工作是" + s);
}
}
-
接口和抽象类的区别
1、接口用于规范,抽象类用于共性。
2、接口中只能声明方法,属性,事件,索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。
3、抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。
4、抽象类可以提供某些方法的部分实现,接口不可以。
5、抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。
6、在抽象类中加入一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写。
7、接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。
8、接口不能包含字段、构造函数、析构函数、静态成员或常量。
-
C#中接口和抽象类的使用上的区别:
- 抽象类不能被实例化,但能拥有自己的成员字段和非抽象的方法,但是接口比抽象类更加抽象其成员只能是一般的方法、属性和索引函数,不能拥有自己的成员字段了构造函数
- 用abstract成声明的抽象类必须有访问权限修饰符如publlic等关键字进行修饰,其次抽象类里面的方法需用abstract声明为抽象方法或者用virtual声明为虚拟方法非抽象方法除外,虚拟方法有简单执行代码,派生类中可以选择不重载,抽象方法没有任何执行代码,派生类中必须重载)。在其派生类中重载抽象方法或虚拟方法时必须用override修饰。而在用interface声明的接口类中的接口方法第一不允许是静态的,其次除了无执行代码外不能加任何访问限制修饰符,且不能用virtual或abstract进行修饰。同时在直接支持其接口的类型中不能用override修饰符来表示重载方法,且必须支持即实现该接口中的所有方法。但可以用new关键字来隐藏父接口中的方法。
- 接口、抽象类、非抽象类都可以继承接口
- 继承接口后对其接口方法的实现: 实现可以分为“显示实现”和”隐式实现“