C# 如何在接口中对构造函数参数进行约束?

C# 如何在接口中对构造函数参数进行约束?,c#,.net,design-patterns,constraints,C#,.net,Design Patterns,Constraints,如何对构造函数参数进行约束? 这是一种好的做法吗 我有一个接口,需要记录器组件(由unity注入)。 如何强制所有派生类将Logger component(ILogger)作为参数 我找不到任何合适的解决办法 我找到的唯一解决方法是将方法Initialize()放在接口中。这是一种丑陋的方法,需要特殊处理 是否有任何设计模式可以解决此类问题?您不需要强制派生类具有记录器组件的约束。只需定义基类构造函数以获取ILogger public class Foo { public Foo (IL

如何对构造函数参数进行约束?
这是一种好的做法吗

我有一个接口,需要记录器组件(由unity注入)。
如何强制所有派生类将Logger component(ILogger)作为参数

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

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


是否有任何设计模式可以解决此类问题?

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

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#接口完成,因为这些接口定义的是契约,而不是实现。

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

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接口来完成,因为C接口定义的是契约,而不是实现。

你为什么要强制这样做

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

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

interface IAdder
{
    double Add(double first, double second);
}

添加是核心功能。您可以有第三个参数ILogger,但如果没有它,您仍然可以添加。日志记录是实现细节,它不应该成为合同的一部分。

为什么要强制这样做

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

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

interface IAdder
{
    double Add(double first, double second);
}

添加是核心功能。您可以有第三个参数ILogger,但如果没有它,您仍然可以添加。日志记录是实现细节,它不应该成为合同的一部分。

你不能对C#中带有接口的构造函数施加约束。它不像你想象的那样丑陋,它似乎有一个
Initialize
方法接受这些组件需要的任何东西。无论如何,这是解决这个问题的标准方法。你不能对C#中带有接口的构造函数施加约束。它不像你让它看起来有一个
Initialize
方法接受这些组件需要的任何东西那样丑陋。无论如何,这是解决这个问题的标准方法。