How to put constraint on constructor parameters in interface?
如何对构造函数参数进行约束?这是个好习惯吗?
我有一个接口,我需要记录器组件(由Unity注入)。如何强制所有派生类使用logger组件(ilogger)作为参数?
我找不到任何合适的解决办法。
我找到的唯一解决方法是将方法
有没有解决这些问题的设计模式?
您不需要约束来强制派生类具有记录器组件。只需定义基类构造函数来获取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); } |
添加是核心功能。你可以有第三个论点,伊洛格,但没有它,你仍然可以补充。日志记录是实现细节,它不应该是契约的一部分。