c#基础之接口

接口关键字:interface

接口的定义:是指一组函数成员而不实现成员的引用类型,其他类型和接口可以继承接口。

接口的特点:

  1. 通过接口可以实现多重继承,c#接口的成员不能包含public、protected、internal、private等修饰符。原因是很简单的,因为接口里面的方法都需要外面的接口是实现方法体,那么修饰符必然是public。c#接口中的成员默认是public的。
  2. 接口成员不能有new、static、abstract、override、virtual修饰符。但是有一点要注意的是*当一个接口实现一个接口,两个接口有同样的方法时,可以用new关键字用来隐藏父接口中的方法*。
  3. 接口中只包含成员的签名,接口中没有构造函数,所以不能直接使用new关键字对接后实例化。接口中只能包含方法的属性、事件和索引的组合。接口一旦被实现,实现类必须实现接口中的所有成员,除非实现类本身是抽象类。
  4. c#是单继承,接口是结局也c#里面类可以同时竭诚多个基类的问题。
  5.  接口是一个规范,能力,为了多态,接口不能被实例化,用interface;接口不允许包含字段。方法体,可以写自动属性
  6. 接口可以继承接口,不能继承一个类
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#中接口和抽象类的使用上的区别:

  1. 抽象类不能被实例化,但能拥有自己的成员字段和非抽象的方法,但是接口比抽象类更加抽象其成员只能是一般的方法、属性和索引函数,不能拥有自己的成员字段了构造函数
  2. 用abstract成声明的抽象类必须有访问权限修饰符如publlic等关键字进行修饰,其次抽象类里面的方法需用abstract声明为抽象方法或者用virtual声明为虚拟方法非抽象方法除外,虚拟方法有简单执行代码,派生类中可以选择不重载,抽象方法没有任何执行代码,派生类中必须重载)。在其派生类中重载抽象方法或虚拟方法时必须用override修饰。而在用interface声明的接口类中的接口方法第一不允许是静态的,其次除了无执行代码外不能加任何访问限制修饰符,且不能用virtual或abstract进行修饰。同时在直接支持其接口的类型中不能用override修饰符来表示重载方法,且必须支持即实现该接口中的所有方法。但可以用new关键字来隐藏父接口中的方法。
  3. 接口、抽象类、非抽象类都可以继承接口
  4. 继承接口后对其接口方法的实现: 实现可以分为“显示实现”和”隐式实现“
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章