在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#语法。
详细拆解
主构造函数语法
你看到的MyService(IHttpClientFactory httpClientFactory)是C# 9.0及以上引入的主构造函数写法,替代了传统的显式构造函数定义,编译器会自动处理这个构造函数的逻辑。基类构造函数的显式调用
冒号后的BaseService()是明确指定调用BaseService的无参构造函数:- 因为
BaseService没有定义任何显式构造函数,编译器会自动为它生成一个默认的无参构造函数; - 哪怕你不写
BaseService(),编译器也会隐式调用基类的无参构造函数,这里只是显式写出来了; - 抽象类也可以有构造函数,子类继承时必须调用基类的某个构造函数(显式或隐式)。
- 因为
MyService实际关联的内容
- 类型层级:
MyService是BaseService的子类,满足is BaseService的类型判断; - 静态成员:严格来说静态成员不属于“继承”范畴,但
MyService可以直接访问BaseService的静态成员(比如MyService.DEFAULT_DOMAIN); - 因为
BaseService没有定义任何实例成员,所以MyService没有继承到实例方法/字段,但依然保持了类的继承关系。
- 类型层级:
关于构造函数的误区
构造函数不能被继承,子类只能调用基类的构造函数。这里的BaseService()是调用基类的默认构造函数,而非继承它。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

