3

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

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

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

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

我目前支持选项 3,但过时似乎不是正确的描述。

有任何想法吗?

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

4

4 回答 4

4

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

public interface IReadOnlyRepository
{
    void Read();
}

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

然后你可以IReadOnlyRepository为你不想要完整实现的类使用“基础”接口。

或者,当用户尝试从没有实现 C 的类中调用 C 时,使用您的编号 3。抛出NotImplementedException/InvalidOperationException或其他相关异常。

我希望这有帮助。

于 2013-09-12T10:56:45.630 回答
3

为什么没有2个接口?

IReadableRepo
{
    Data Read();
}

IUpdatableRepo : IReadableRepo
{
    void Update();
}

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

于 2013-09-12T10:55:47.757 回答
3

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

但作为一种实用方法,仅针对一种情况,您可以从 Update() 方法中引发 NotSupported 异常。这是您的选项 3,但您不能真正有效地标记它以获取编译时反馈。

于 2013-09-12T10:56:25.637 回答
1

我不是这些问题的专家,但从我的角度来看,如果您决定只使用一个界面,我会发现一个问题,看起来您提供的功能不受支持。

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

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

于 2013-09-12T11:03:06.863 回答