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

时间:2013-09-12 10:53:21

标签: c# interface

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

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

  1. 为该一个类创建一个单独的界面
  2. 实施 原始界面,但方法为空
  3. 实现原始界面,但以某种方式标记不必要的方法 (例如过时的属性)
  4. 一个例子是,如果我有5个实体的接口IRepository和5个单独的存储库,但对于一个实体,我不希望能够更新记录。

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

    任何想法?

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

4 个答案:

答案 0 :(得分:4)

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

public interface IReadOnlyRepository
{
    void Read();
}

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

然后你可以使用'base'接口IReadOnlyRepository作为你不想完全实现的类。

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

我希望这会有所帮助。

答案 1 :(得分:3)

为什么没有2个接口?

IReadableRepo
{
    Data Read();
}

IUpdatableRepo : IReadableRepo
{
    void Update();
}

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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

在这种情况下,您可以通过ReadableRepository扩展基本接口UpdateableRepository

但是,如果由于某种原因您需要为存储库添加更多属性,您可以考虑为每个属性创建单独的接口(IDoable1IDoable2,...,{{1}并且让你的具体类实现他们需要的东西。