接口(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) |