Skip to content

接口 Interface

接口是一组函数成员,但不实现他们。

接口可以解决类型的兼容性问题,将类型提取出一套统一的格式以供其他程序使用。

例如 CA 和 CB 类含有不同格式的个人信息,接口就可以很方便的把个人信息提取出来,以便其他程序使用。

interface IInfo //定义接口
{
    string GetName();
    string GetAge();
}

class CA : IInfo // 声明CA类实现了这个接口
{
    public string Name;
    public int Age;

    // 实现接口
    public string GetName() => Name;
    public string GetAge() => Age.ToString();
}

class CB : IInfo
{
    public string FirstName;
    public string LastName;
    public int Age;

    public string GetName() => FirstName + " " + LastName;
    public string GetAge() => Age.ToString();
}

class Program
{
    static void PrintPersonalInfo(IInfo item) // 传入接口引用
    {
        Console.WriteLine($"Name: {item.GetName()}, Age: {item.GetAge()}");
    }

    static void Main()
    {
        CA ca = new CA() { Name = "Carson", Age = 18 };
        CB cb = new CB() { FirstName = "Jack", LastName = "Li", Age = 20 };

        PrintPersonalInfo(ca);
        PrintPersonalInfo(cb);
    }
}

可以扩展BCL基础库中实现的接口,来实现自定义的功能,例如自定义类型MyClass希望实现Array.Sort方法,可以通过扩展 ICompareable 接口来实现对应的比较方法。

class MyClass : IComparable
{
    public int TheValue;
    public int CompareTo(object? obj) // CompareTo是接口里声明的比较方法
    {
        MyClass mc = (MyClass) obj;
        if (this.TheValue < mc.TheValue) return -1;
        if (this.TheValue > mc.TheValue) return 1;
        return 0;
    }
}

这样可以实现Array.Sort()方法:

MyClass[] myArr = new MyClass[5];
Array.Sort(myArr);

声明接口

除了实现BCL中的接口外,也可以自己声明接口。

但声明接口不能包括数据成员或者静态成员。