跳转至

接口(Interface)#

来源:D:\study\C#1\stu0728

接口定义了一组行为规范(方法签名、属性),不包含实现。类通过实现接口来承诺提供这些行为。

基本语法#

// 定义接口
interface IA
{
    string A { get; }
    string B { get; }
    int D { get; set; }
    void Fn();
}

// 类实现接口
class Test : IA, IB
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public void Fn() { }
    public void Fn(string str) { }
}

多接口实现#

一个类可以实现多个接口(C# 不支持多继承,但可以通过多接口实现类似效果):

interface IA
{
    string A { get; }
    string B { get; }
    int D { get; set; }      // 属性 D 是 int 类型
    void Fn();
}

interface IB
{
    string B { get; }
    string C { get; }
    string D { get; set; }   // 属性 D 是 string 类型 — 与 IA 的 D 类型冲突!
    void Fn(string str);
}

// 一个类实现两个接口
class Test : IA, IB
{
    public string A { get; set; }
    public string B { get; set; }   // 两个接口都有 B,只需实现一次
    public string C { get; set; }

    // ⚠️ 冲突:IA.D 是 int,IB.D 是 string
    // 必须使用显示接口实现来解决冲突
    int IA.D { get; set; }
    string IB.D { get; set; }

    // 方法可以重载,不需要显示实现
    public void Fn() { }
    public void Fn(string str) { }
}

显示接口实现#

当多个接口中存在同名但类型不同的成员时,需要使用显示接口实现

// 显示实现 — 通过 "接口名.成员名" 语法
int IA.D { get; set; }    // 实现 IA 的 int 类型 D
string IB.D { get; set; } // 实现 IB 的 string 类型 D

访问方式:

Test test = new Test();
(test as IA).D = 10;           // 访问 IA.D(int 类型)
((IB)test).D = "qwer";         // 访问 IB.D(string 类型)

注意:显示实现的成员默认是 private 的,只能通过接口类型访问,不能通过类实例直接访问。

接口继承#

接口可以继承其他接口,形成接口继承链:

// IA 接口
interface IA
{
    string Name { get; set; }
    int Age { get; set; }
}

// IB 继承 IA — IB 包含了 IA 的所有成员 + 自己的成员
interface IB : IA
{
    string Sex { get; set; }
}

// 实现 IB 的类必须实现 IA 和 IB 的所有成员
class Test : IB
{
    // 需要实现:Name(来自 IA)、Age(来自 IA)、Sex(来自 IB)
    string IB.Sex { get; set; }
    string IA.Name { get; set; }
    int IA.Age { get; set; }
}

抽象类 vs 接口#

对比 抽象类 接口
能否包含实现 ✅ 可以有普通方法、字段 ❌ 只能有方法签名、属性(无实现)
继承数量 只能继承一个类 可以实现多个接口
访问修饰符 可以有 public/protected 不能有访问修饰符
字段 ✅ 可以有字段 ❌ 不能有字段
重写关键字 子类用 override 子类直接实现(不需要 override)


相关笔记#