在 C# 中接口定义了一组行为契约而具体类负责实现这些契约。对于同一个接口C# 提供了两种实现方式隐式接口实现和显式接口实现。两者在语法、访问方式和适用场景上都有明显差异理解它们的区别是写出清晰、可维护代码的关键一步。本文将从最基础的示例出发逐步讲清两种实现方式的写法、调用规则和常见坑点最后给出一个同时实现多个接口的完整实例。一、隐式接口实现隐式实现是最常见的方式类直接声明实现接口并用public修饰符实现接口成员。先定义一个接口IChinese其中包含一个成员Speakpublic interface IChinese { string Speak(); }再创建一个类Speaker实现该接口public class Speaker : IChinese { public string Speak() { return 中文; } }这就是隐式实现接口接口成员在类中以普通公有方法的形式出现方法名与接口定义完全一致。隐式实现的调用方式隐式实现既可以用接口类型声明变量也可以用实现类类型声明变量两种方式都能调用到Speak方法IChinese s1 new Speaker(); s1.Speak(); Speaker s2 new Speaker(); s2.Speak();两种写法都能正常调用Speak方法这也是隐式实现最直观的地方。二、显式接口实现显式实现则要求成员名前面带上接口名称并用一个句点连接例如IEnglish.Speak()。同时显式实现的成员不能带任何访问修饰符。先定义接口IEnglishpublic interface IEnglish { string Speak(); }再用显式方式实现public class Speaker : IEnglish { string IEnglish.Speak() { return English; } }通过这种显式接口实现Speak方法只能通过接口来调用IEnglish s new Speaker(); s.Speak();而下面这种写法会直接编译错误Speaker s new Speaker(); s.Speak(); // 编译错误Speaker 不包含 Speak 的定义三、隐式实现与显式实现的区别1. 语法上的区别隐式实现类中的成员Speak必须有访问修饰符通常是public。显式实现类中的成员Speak不能带任何访问修饰符并且要用「接口名.方法名」的形式命名例如IEnglish.Speak()。2. 调用上的区别隐式实现时类的声明既可以是接口类型也可以是实现类类型调用者都能得到实例化对象的行为class Program { static void Main(string[] args) { IChinese s1 new Speaker(); s1.Speak(); Speaker s2 new Speaker(); s2.Speak(); } }显式实现时只能用接口类型声明变量调用者才能访问到对应行为class Program { static void Main(string[] args) { IEnglish s new Speaker(); s.Speak(); // 下面写法将引起编译错误 // “Speaker”不包含“Speak”的定义 // Speaker s2 new Speaker(); // s2.Speak(); } }结论隐式实现的对象声明为接口或类都可以访问到其行为显式实现的对象只有声明为接口才能访问。四、为什么需要显式接口实现如果两个接口中存在同名方法而一个类同时实现这两个接口就会出现不确定的情形编写方法时无法确定当前实现的是哪个接口的方法。为解决这一问题C# 提供了显式接口实现技术在方法名前加上接口名称用接口名称来限定成员通过「接口名.方法名()」区分实现的是哪一个接口。注意显式接口实现时方法名前不能加任何访问修饰符。这一点和普通方法不同普通方法前不加访问修饰符时默认为私有而显式接口实现的方法前不加修饰符时默认是公有的如果强行加上修饰符会出现编译错误。调用显式接口实现的正确方式是通过接口引用由接口引用来确定要调用的版本。五、完整实例同时实现多个接口下面通过一个完整示例演示一个类同时实现IPerson和IStudent两个接口并用显式实现区分同名方法。using System; public interface IPerson { string Name { get; set; } void Show(string name); } public interface IStudent { string StudentId { get; set; } void Show(string studentid); } public class Student : IPerson, IStudent { private string _name; public string Name { get { return _name; } set { _name value; } } private string _studentid; public string StudentId { get { return _studentid; } set { _studentid value; } } void IPerson.Show(string name) { Console.WriteLine(姓名为{0}, name); } void IStudent.Show(string studentid) { Console.WriteLine(学号为{0}, studentid); } } class Program { static void Main() { Student s new Student(); Console.WriteLine(输入姓名); s.Name Console.ReadLine(); Console.WriteLine(输入学号); s.StudentId Console.ReadLine(); IPerson per s; per.Show(s.Name); IStudent stu s; stu.Show(s.StudentId); } }在这个例子中Student类通过显式实现把IPerson.Show和IStudent.Show区分开来。调用时必须先转换为对应的接口引用才能调用到正确的方法版本。六、如何选择对比项隐式实现显式实现成员命名与接口成员同名接口名.成员名访问修饰符必须有通常为 public不能有任何访问修饰符调用方式接口引用或类引用均可只能通过接口引用适用场景常规接口实现多接口同名成员、隐藏实现细节一般来说如果接口成员就是类的公开行为用隐式实现更简洁如果多个接口存在同名成员或者希望把接口实现细节隐藏起来、只允许通过接口访问就应使用显式实现。七、小结隐式实现成员用public修饰接口引用和类引用都能调用。显式实现成员写成「接口名.成员名」不能加访问修饰符只能通过接口引用调用。当多个接口存在同名方法时显式实现是区分方法版本的标准做法。选择哪种方式取决于是否需要隐藏实现细节以及是否存在命名冲突。