关于c#:如何在接口中对构造函数参数设置约束?

How to put constraint on constructor parameters in interface?

如何对构造函数参数进行约束?这是个好习惯吗?

我有一个接口,我需要记录器组件(由Unity注入)。如何强制所有派生类使用logger组件(ilogger)作为参数?

我找不到任何合适的解决办法。

我找到的唯一解决方法是将方法Initialize ()放入接口中。这是一个丑陋的方法,需要特殊的处理。

有没有解决这些问题的设计模式?


您不需要约束来强制派生类具有记录器组件。只需定义基类构造函数来获取ilogger。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Foo
{
    public Foo (ILogger logger) { /* some implementation here */ }
}

public class Bar : Foo
{
    public Bar(ILogger logger)
        : base(logger)
    {
        // some implementation here
    }
}

因为bar是从foo派生的,所以它必须使用接受记录器的构造函数。您还可以将foo设置为抽象的,这将强制用户创建派生类的实例,而不是foo本身。

当你需要定义一个接口时,不要仅仅考虑一个C接口。抽象类非常适合这样的情况。将抽象类视为接口(而不是C接口)是很常见的。您所要求的不能用C接口完成,因为这些接口定义契约,而不是实现。


你为什么要强迫这样的事情?

关注什么是真正的契约(由接口定义),而不是像日志这样不重要的事情。合同的定义方式应该是,在不丧失执行核心功能的能力的情况下,不能删除任何方法/属性。

例如,如果您有一个接口:

1
2
3
4
interface IAdder
{
    double Add(double first, double second);
}

添加是核心功能。你可以有第三个论点,伊洛格,但没有它,你仍然可以补充。日志记录是实现细节,它不应该是契约的一部分。