处理从接口继承的对象之间的差异

时间:2015-05-22 13:40:16

标签: c#

我有两个从我创建的接口继承的对象,它工作得很好。将对象注入到另一个对象中,调用该对象的方法。对象的方法执行一些简单的xml操作,然后返回到worker对象。

我现在有一个更改请求,它影响一个从接口继承而不是另一个继承的对象,而且我对如何处理这个问题感到很遗憾。我已经创建了几个新方法,如果没有使用它我只是抛出一个未实现的异常。这似乎不是最佳实践"对我来说。有人可以建议处理这个场景的最佳方法吗?

3 个答案:

答案 0 :(得分:4)

我认为这是Interface Segregation Principle到位的情况。

如果你发现自己有两个对象暴露同一组公共成员是没有意义的,那么他们可能不应该实现相同的接口。或者至少不仅相同的界面。这里有两个选项,具体取决于您的应用程序逻辑:

  1. 保持原始界面不变,并且第一个类(不需要额外方法的类)未经修改。仅为新方法定义新接口,并使第二个类实现两个接口。

  2. 定义一个继承旧接口并包含新方法的新接口。保持您的第一个类不被修改,让您的第二个类实现新接口。

  3. 实现一个接口,除了在某些方法中抛出异常之外什么也不做,这确实是一种不好的做法,因为它打破了Liskov substitution principle

答案 1 :(得分:0)

接口不需要“完全实现”......即使在.NET中,也有部分实现接口的类(当以“非法”方式使用时抛出NotSupportedException())。例如,数组IList<>不支持Add()Remove() ...

Stream抽象类,它有一个额外的“模式”:CanReadCanWriteCanSeek,...,所以有方法和属性告诉我们使用这些方法是否合法。

另一种方法是使用其他接口,并尝试使用as运算符进行转换。实体框架例如“返回”IQueryable<T>,“是”IEnumerable<T> ...但这些对象甚至支持IDbAsyncEnumerable<T>界面...但不是全部IQueryable<T>IDbAsyncEnumerable<T>。您必须进行演员表并查看界面是否存在。

答案 2 :(得分:0)

您可以像这样扩展界面:

public interface SimpleInterface 
{
    void SimpleMethod();
    void OtherMethod();
}

public interface ExpandedInterface : SimpleInterface
{
    void ExpandedMethod();
    void OtherExpandedMethod();
}

这样你可以在你的客户端代码上声明你是否真的需要一个扩展的接口实现者(在这种情况下你应该只传递实现ExpandedInterface的具体类子集的一个实例)或者它就足够了使用SimpleInterface实施者(在这种情况下你可以通过)。

您提出的情况(需要将函数添加到一个对象而不是其他对象)与客户端代码有关,而不是接口实现者本身。您必须考虑:&#34;在此客户端类中,我真正需要什么:SimpleInterface的实例,或ExtendedInterface的实例?&#34;