在C#中,接口(interface)用于定义契约——它不包含实现,只声明方法、属性、事件或索引器的签名,具体实现由类或结构体完成。 接口支持多继承,是实现松耦合、依赖倒置和面向接口编程的关键机制。
定义接口:用 interface 关键字
接口用 interface 关键字声明,名称通常以大写字母 I 开头(如 IRepository)。接口内只能包含公有成员声明,不能有字段、构造函数、析构函数或静态成员(C# 8.0+ 允许默认实现和静态抽象成员,但基础用法仍以纯契约为主)。
示例:
public interface IAnimal
{
string Name { get; set; }
void MakeSound();
int Legs { get; }
}实现接口:用冒号 + 接口名
类或结构体通过 : 后跟接口名来实现接口。所有接口成员必须在实现类型中提供 public 的具体实现(除非是显式接口实现)。
实现属性需同时满足接口中 get/set 修饰符要求(如接口只写 get;,实现中可只提供 get 访问器) 方法必须与接口签名完全一致(返回类型、名称、参数个数与类型) 若一个类实现多个接口,用逗号分隔:class Dog : IAnimal, IMovable示例:
public class Dog : IAnimal
{
public string Name { get; set; }
public int Legs => 4;
<pre class="brush:php;toolbar:false;">public void MakeSound()
{
Console.WriteLine("Woof!");
}}
显式接口实现:解决命名冲突或隐藏细节
当多个接口有同名成员,或想让接口成员仅通过接口类型访问(避免污染类的公共API),可用显式实现:不加访问修饰符,写成 接口名.成员名。
显式实现的成员只能通过接口变量调用 不能加 public 或其他修饰符 常用于实现 IEnumerable 或自定义集合接口时隐藏非核心方法示例:
public class Container : IEnumerable, IDisposable
{
// 显式实现 IDisposable.Dispose
void IDisposable.Dispose() => Console.WriteLine("Disposed");
<pre class="brush:php;toolbar:false;">// 显式实现 IEnumerable.GetEnumerator
IEnumerator IEnumerable.GetEnumerator() => ...;}
接口继承与组合:构建分层契约
接口可以继承其他接口,用 : 语法,支持多重继承。子接口会自动包含父接口所有成员。
适合按能力拆分:如 IReadable、IWritable 可被 IReadWrite 继承 实现类只需写最顶层接口,无需重复列出所有父接口 C# 8.0+ 支持默认接口方法(带实现),但慎用,避免破坏“接口=契约”的语义示例:
public interface IWalkable
{
void Walk();
}
<p>public interface IRunnable : IWalkable // 继承 IWalkable
{
void Run();
}</p><p>public class Human : IRunnable // 自动也实现了 IWalkable
{
public void Walk() => Console.WriteLine("Walking");
public void Run() => Console.WriteLine("Running");
}</p>基本上就这些。接口不是模板也不是基类,它是“能做什么”的约定。写得好,代码就容易测试、替换和扩展。
