实现不必要的接口成员或创建新接口
本文关键字:接口 新接口 创建 不必要 成员 实现 | 更新日期: 2023-09-27 18:31:00
我一直在思考的一般架构问题
如果我有一个接口,以及 5 个实现该接口的类,但一个类不需要实现其中一个接口成员,我应该:
- 为该类创建单独的接口
- 实现原始接口,但将方法留空
- 实现原始接口,但以某种方式标记不必要的方法(例如过时的属性)
例如,如果我有一个接口 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
.
但是,如果由于某种原因,您的存储库需要更多的属性,您可以考虑为每个(IDoable1
、IDoable2
、...、IDoableN
)创建单独的接口,并让您的具体类实现它们需要的内容。