在C#中,可以从方法继承吗?

问题描述 投票:0回答:2

现在,如果标题听起来很奇怪,请考虑我今天正在审查的这段代码(简化版):

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# oop inheritance base-class
2个回答
0
投票

您所看到的是 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)
{
    // ...
}

参考,从中获取示例:教程:探索主构造函数


0
投票

引入主构造函数后,这成为可能。

您可以定义一个类,例如:

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)
    {
        // ....
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.