概述

  1. 接口是指定一组函数成员而不实现它们的引用类型,只能使用类和结构来实现接口.
  2. 接口可以有访问修饰符,接口成员不能有访问修饰符.
  3. 接口声明不能包含数据成员,静态成员.
  4. 只有类和结构才能实现接口.
+ 接口声明
  1. 接口声明可以有任何的访问修饰符.接口成员不允许有任何访问修饰符,且默认是隐式 public 的.
public interface IMyInterface {
    // 错误,接口成员不能有访问修饰符
    private void PrintOut(string s);
}
+ 接口实现
  1. 如果类实现了接口,必须实现接口的所有成员.
  2. 如果类派生自一个实现了接口的基类,基类必须放在所有接口之前,且只能有一个基类名称.
// 基类:BaseClass
// 接口:IIfc1,IEnumrable,IComparable
class Derived : BaseClass, IIfc1, IEnumrable, IComparable {

}

使用 IComparable 接口

+ IComparable 接口
  1. 内置类型实现了 IComparable 接口,可以直接使用.自定义类型需要实现 IComparable 接口.

接口实例

多个接口的引用
派生成员实现接口
using System;

interface IIfc1 {
    void PrintOut(string s);
}

interface IIfc2 {
    void PrintOut(string t);
}

class MyClass: IIfc1, IIfc2 {
    public void PrintOut(string s) {
        Console.WriteLine($"Calling through:{s}");
    }
}

class Program {
    static void Main() {
        MyClass mc = new MyClass();
        // 调用类对象的实现方法
        mc.PrintOut("object");
        
        // 类对象引用转化为接口类型引用
        IIfc1 ifc1= (IIfc1)mc;
        IIfc2 ifc2= (IIfc2)mc;
        // 调用接口方法
        ifc1.PrintOut("interface1");
        ifc2.PrintOut("interface2");
    }
}
using System;

interface IIfc1 {
    void PrintOut(string s);
}

interface IIfc2 {
    void PrintOut(string t);
}

class MyBaseClass {
    public void PrintOut(string s) {
        Console.WriteLine($"Calling through:{s}");
    }
}

// 如果类派生自基类并实现了接口, 基类列表中的基类名称必须放在所有接口之前.
// 并且只能有一个基类,列出的其它类型必须为接口类型.
class Derived: MyBaseClass, IIfc1, IIfc2 {
    
}

class Program {
    static void Main() {
        Derived d = new Derived();
        d.PrintOut("Object");
    }
}