You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:45:30