C#中使用接口名与类名创建对象的差异及优势
用接口类型声明对象实例的好处,以及两种创建方式的区别
一、用接口名创建对象实例的主要好处
- 解耦代码依赖:代码只依赖接口定义的行为,而非具体实现类。后续如果要替换实现(比如把
Customer换成同样实现ISampleInterface的VIPCustomer),只需修改new后的类名,声明变量的代码完全不用改动。 - 限制调用范围:只能调用接口中定义的方法,避免误操作实现类的专属方法或属性,强制代码遵循接口约定,减少不必要的耦合。
- 适配多态场景:用接口类型作为集合、方法参数或返回值时,能兼容所有实现该接口的类实例。比如
List<ISampleInterface>可以存放Customer、Supplier等任意实现类的对象,大幅提升代码通用性。
二、两种创建方式的具体区别
先给出基础代码示例:
public interface ISampleInterface { void DoSomething(); } public class Customer : ISampleInterface { public void DoSomething() { /* 接口方法实现 */ } public void CustomerOnlyMethod() { /* Customer类专属方法 */ } }
方式1:ISampleInterface customer = new Customer();
- 仅能调用
ISampleInterface中定义的方法(比如customer.DoSomething()),尝试调用CustomerOnlyMethod()会直接触发编译错误,从源头避免误用实现类专属功能。 - 变量
customer的编译时类型是ISampleInterface,运行时类型是Customer。后续可直接将其替换为其他实现类的实例(比如customer = new VIPCustomer();),代码无需额外修改。 - 适合业务逻辑层、方法参数等场景,让代码聚焦于“要做什么”,而非“谁来做”。
方式2:Customer customer = new Customer();
- 既可以调用接口定义的
DoSomething(),也能直接使用Customer的专属方法CustomerOnlyMethod(),调用权限无限制。 - 变量的编译时和运行时类型均为
Customer,后续若要替换为其他实现类实例,必须进行强制类型转换,灵活性较差。 - 适合需要直接操作
Customer专属属性或方法的场景,比如数据访问层的特定业务处理。
内容的提问来源于stack exchange,提问作者Berke Kaan Cetinkaya
相关产品推荐
相关产品推荐

