实现不必要的接口成员或创建新接口

本文关键字:接口 新接口 创建 不必要 成员 实现 | 更新日期: 2023-09-27 18:31:00

我一直在思考的一般架构问题

如果我有一个接口,以及 5 个实现该接口的类,但一个类不需要实现其中一个接口成员,我应该:

  1. 为该类创建单独的接口
  2. 实现原始接口,但将方法留空
  3. 实现原始接口,但以某种方式标记不必要的方法(例如过时的属性)

例如,如果我有一个接口 IRepository 和 5 个单独的存储库,用于 5 个实体,但对于一个实体,我不希望能够更新记录。

我目前倾向于选项 3,但过时似乎不是一个正确的描述。

有什么想法吗?

顺便说一下,我知道这是相当广泛和客观的,但我想听听一些关于最佳方法的意见。

实现不必要的接口成员或创建新接口

您可以创建另一个接口并继承您实际使用的接口

public interface IReadOnlyRepository
{
    void Read();
}
public interface IRepository : IReadOnlyRepository
{
    void Write();
}

然后,您可以将"base"接口IReadOnlyRepository用于您不希望完整实现的类。

或者,当用户尝试从未实现 C 的类调用 C 时,使用数字 3。抛出NotImplementedException/InvalidOperationException或其他相关异常。

我希望这有所帮助。

为什么没有 2 个接口?

IReadableRepo
{
    Data Read();
}
IUpdatableRepo : IReadableRepo
{
    void Update();
}

然后在您的类中实现最相关的一个。

正式的答案是将其拆分为IRepository: IReadonlyRepository并仅实现适用的接口。

但作为一种实用的方法,对于一种情况,您可以从 Update() 方法中抛出 NotSupported 异常。这是您的选项 3,但您无法真正有效地标记它以进行编译时反馈。

我不是这方面的专家,但从我的角度来看,如果您决定只坚持使用一个界面,我会看到一个问题,似乎您正在提供不支持的功能。

在这种情况下,您可以有一个基本接口ReadableRepository扩展 UpdateableRepository .

但是,如果由于某种原因,您的存储库需要更多的属性,您可以考虑为每个(IDoable1IDoable2、...、IDoableN)创建单独的接口,并让您的具体类实现它们需要的内容。