C#中创建对象或传参时为何声明接口作为类型?
这问题问到点子上了——用接口作为类型正是C#高级OOP里多态和依赖解耦的核心实践,咱们结合你的代码来掰扯清楚:
1. 解锁多态能力,让代码更灵活
接口就像一份“行为契约”,只要类实现了这个契约,就可以被当作接口类型来使用。比如你的代码里,LoveLetter实现了ILetter的Read()方法,那用ILetter myLetter = new LoveLetter();声明后,后续如果需要替换成另一种信件(比如商务信),只要新类也实现ILetter,原来的调用逻辑完全不用改:
// 新增一个实现ILetter的类 class BusinessLetter : ILetter { public void Read(){ Console.WriteLine("Business Letter Reading"); } } // 原来的代码丝毫不改,直接替换实例 ILetter anotherLetter = new BusinessLetter(); anotherLetter.Read(); // 输出 "Business Letter Reading"
这就像你说“给我拿封信读”,不管是情书还是商务信,只要是符合“能读”这个契约的信,都能满足需求,不用针对每种信写一套逻辑。
2. 降低代码耦合,遵循依赖倒置原则
如果你的方法参数用接口类型而非具体类,就能彻底摆脱对特定类的依赖。比如写一个通用的读信方法:
static void ReadLetter(ILetter letter) { letter.Read(); }
不管是LoveLetter、BusinessLetter还是以后新增的任何信件类,都能直接传给这个方法。要是当初参数写的是LoveLetter,那每次新增信件类型都得修改方法,耦合度太高,维护起来简直是噩梦。
3. 隐藏冗余细节,聚焦核心行为
当你用ILetter作为类型时,只能访问接口中定义的Read()方法。假设LoveLetter还有个专属方法WriteLoveNote(),通过ILetter引用是访问不到的——这其实是件好事:你只需要关心“这是一封信,能读”这个核心行为,不用被类里的其他无关功能干扰,既避免了误用,也让代码逻辑更清晰。
回到你的示例代码,ILetter myLetter = new LoveLetter();本质就是把具体的“情书”封装到抽象的“信件”类型里,这一步直接让你的代码具备了扩展性和灵活性,也是高级OOP里抽象思维的体现。
内容的提问来源于stack exchange,提问作者Blithe

