现在,如果标题听起来很奇怪,请考虑我今天正在审查的这段代码(简化版):
public class MyService(
IHttpClientFactory httpClientFactory) :
BaseService(), // WTF? a Method?
IMyService
{
//no explicit constructor, has default constructor
//....
}
这确实编译了。
MyService
类从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";
// ....
}
MyService
在这里继承了什么?
我从来没有见过这种C#继承,而且这些微软的继承文档似乎也没有提到它。
您所看到的是 C# 的新功能——主构造函数。它允许定义类并定义与类定义内联的构造函数:
public class MyClass(string message, string etc)
{
// ... some stuff
}
这自然会扩展调用基类构造函数。按照旧的方式,它曾经是:
public LineOfCreditAccount(string accountID, string owner, decimal creditLimit)
: base(accountID, owner)
{
_creditLimit = creditLimit;
}
采用新方法是
public class SavingsAccount(string accountID, string owner, decimal interestRate)
: BankAccount(accountID, owner)
{
// ...
}
参考,从中获取示例:教程:探索主构造函数
引入主构造函数后,这成为可能。
您可以定义一个类,例如:
public class Foo(int arg1, int arg2)
{
// ....
}
(几乎)相当于
public class Foo
{
Foo(int arg1, int arg2)
{
// ...
}
}
还需要一种以这种方式调用基类构造函数的方法,这就是这里发生的情况。在我的示例中,派生类可以读为
public class Derived() : Foo(2,3)
{
// ....
}
请注意,使用此语法时还需要在派生类上创建主构造函数。
()
不是可选的。
但是你当然可以再次使用旧样式:
public class Derived2 : Foo
{
public Derived2()
: base(2, 3)
{
// ....
}
}