当您创建一个接口并且您知道您将依赖另一个接口时,您是否将构造函数作为接口的一部分?
就我而言,我想创造
我可以给客户端的IClientReceiveRecorder,并为短暂的测试会话收集所有网络流量.它可能只包含一组字符串.
一个IEvaluator,可以获取收到的所有消息并实现我们想要测试的各种内容.例如,我可能有一个具体的Evaluator来测试所有字符串是否包含字母'c'.
我知道任何IEvaluator都需要一个IClientReceiveRecorder来获取它要评估的消息.
所以,我看到了一些选择.我会做点什么吗?
interface IEvaluator
{
IEvaluator(IClientReceiveRecorder);
void Evaluate();
}
Run Code Online (Sandbox Code Playgroud)
它不编译,所以我猜不是.
也许我会这样做
interface IEvaluator
{
void Evaluate(IClientReceiveRecorder);
}
Run Code Online (Sandbox Code Playgroud)
或者,我是否只是将它留给具体类来在其构造函数中使用IClientReceiveRecorder?
直截了当的答案是将实现细节留给具体类.
知道实现IEvaluator将具有依赖性IClientReceiveRecorder是实现细节,并且不会包含在IEvaluator接口中.
如果您知道该接口将由另一个接口组成,您可以执行以下操作:
interface IEvaluator
{
IClientReceiveRecorder { get; set; }
void Evaluate();
}
Run Code Online (Sandbox Code Playgroud)
如何填充该属性是一个实现细节,不应该是接口的一部分.
你真的不需要。
接口不一定是依赖关系的契约,而是功能的契约。任何实现都可以通过构造函数公开其依赖项。但是,如果不同的实现具有不同(或没有)依赖项,它仍然实现接口并公开功能。
您可以做的一件事是在界面中公开一个属性 getter,以显示依赖关系。这至少意味着实现类型需要公开具有预期类型的 getter,而这恰好是一个依赖项。
另一种完全可能的选择是使用抽象类而不是接口。(当然,要了解它们之间的差异。)该抽象类还可以使用构造函数来公开依赖关系,并且实现类型必须使用该构造函数。这种替代方案可能需要对整个代码进行其他更改,因此这取决于您。
| 归档时间: |
|
| 查看次数: |
174 次 |
| 最近记录: |