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

在C#中能否从方法继承?一段可编译代码引发的疑问

解析C#中看似“调用基类方法”的继承写法

先看你评审的这段代码:

MyService代码

public class MyService(
    IHttpClientFactory httpClientFactory) : 
        BaseService(), // 看起来像调用方法?
        IMyService
{
    // 无显式构造函数,但包含默认构造函数逻辑
    // .... 
}

BaseService代码

public abstract class BaseService
{
    public static List<MaintenanceWindow> RegisteredMaintenanceWindows = new List<MaintenanceWindow>();
    protected static string CERT_SERVICE_URI = "https://cert.example.com";
    public static string DEFAULT_DOMAIN = "default.example.com";
    // ....
}

核心结论

BaseService()不是调用基类方法,而是显式调用基类的默认无参构造函数,这是完全合法的C#语法。

详细拆解

  1. 主构造函数语法
    你看到的MyService(IHttpClientFactory httpClientFactory)是C# 9.0及以上引入的主构造函数写法,替代了传统的显式构造函数定义,编译器会自动处理这个构造函数的逻辑。

  2. 基类构造函数的显式调用
    冒号后的BaseService()是明确指定调用BaseService的无参构造函数:

    • 因为BaseService没有定义任何显式构造函数,编译器会自动为它生成一个默认的无参构造函数;
    • 哪怕你不写BaseService(),编译器也会隐式调用基类的无参构造函数,这里只是显式写出来了;
    • 抽象类也可以有构造函数,子类继承时必须调用基类的某个构造函数(显式或隐式)。
  3. MyService实际关联的内容

    • 类型层级:MyService是BaseService的子类,满足is BaseService的类型判断;
    • 静态成员:严格来说静态成员不属于“继承”范畴,但MyService可以直接访问BaseService的静态成员(比如MyService.DEFAULT_DOMAIN);
    • 因为BaseService没有定义任何实例成员,所以MyService没有继承到实例方法/字段,但依然保持了类的继承关系。
  4. 关于构造函数的误区
    构造函数不能被继承,子类只能调用基类的构造函数。这里的BaseService()是调用基类的默认构造函数,而非继承它。


内容的提问来源于stack exchange,提问作者Marcel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:43:18