C# 寻找需要多接口继承(而非实现)的示例/案例

C# 寻找需要多接口继承(而非实现)的示例/案例,c#,java,interface,multiple-inheritance,C#,Java,Interface,Multiple Inheritance,C#和Java都支持从多个父级继承的接口: public interface IMyInterface : IInterface1, IInterface2 我在.NETFramework和JavaAPI文档中查找了使用多接口继承的示例 在JavaAPI中,我找到了扩展超级接口和一个或多个“标记”接口的子接口示例(即,它们没有定义的方法)。因此,“标记”接口实际上并没有在实现上强制执行任何内容。我可以看到这一点的好处,尤其是在引入注释之前 在.NET中,我发现接口继承自多个已经相关的父接口。

C#和Java都支持从多个父级继承的接口:

public interface IMyInterface : IInterface1, IInterface2

我在.NETFramework和JavaAPI文档中查找了使用多接口继承的示例

在JavaAPI中,我找到了扩展超级接口和一个或多个“标记”接口的子接口示例(即,它们没有定义的方法)。因此,“标记”接口实际上并没有在实现上强制执行任何内容。我可以看到这一点的好处,尤其是在引入注释之前

在.NET中,我发现接口继承自多个已经相关的父接口。例如,
IList
继承自
ICollection
IEnumerable
,但
ICollection
已经是
IEnumerable
的后代。因此,在实现上强制执行
IEnumerable
已经通过单一继承完成

在这两种情况下,多接口继承看起来要么是冗余的,要么可以被更好的替代方案所取代

如果没有多接口继承,是否有一些示例很难或不可能完成?

您应该从。基本上,您应该创建插在一起的小接口,而不是试图寻找一种方法来组合它们。为什么强制使用对某些类不有用的方法?这通常是多重继承的原因


至于设计是否不可能,我会说不,因为你可以创建一个巨大的界面。然而,ISP指出了这种方法的消极性,这将使维护成为一个潜在的困难,但是在最初的设计中,我会说不,您不需要多重继承来完成一个实现。如果您希望实现接口的所有对象都是可IDisposable和可IComparable,那么它可能看起来很凌乱

例如,如果您有一组资源,您可能希望根据它们的某些属性对它们进行排序或筛选(使用IEquatable)。这意味着所有对象都必须实现这两个接口,您可以使用一个公共接口来实现这一点

IResource<T>: IDisposable, IComparable<T>, IEquatable<T>
IResource:IDisposable、IComparable、IEquatable
在Java中:

Comparable
通常是您希望与主类型分开的内容

AbstractList
子类型包括
AbstractCollection
List

StringBuilder
既是一个
CharSequence
(读取接口)又是一个
可追加的
(写入接口)。我不太喜欢把读写结合在一起——不可变的值和告诉不要问的接口

显然存在(很大程度上是邪恶的)标记接口:
Serializable
Cloneable
RandomAccess


GUI代码尤其倾向于将完全不必要的回调接口实现到一个bug类中,这通常会扩展一个它没有理由扩展的类。

如果我理解您描述.NET接口继承链的方式,那么您就错了。这是一个容易犯的错误,因为文档使它看起来像那样
IList
仅显式继承自
ICollection
;它不继承自
ICollection
IEnumerable
IEnumerable
。以下是参考来源的实际定义:

public interface IList<T> : ICollection<T>
相反,它看起来像这样:

IMine: ICollection<T>, IEnumerable<T>, IEnumerable
IQueryable
需要有一个约定,该约定指定您可以迭代每个元素,但也能够区别于简单的
IEnumerable
,因为它本身,而不是所有的
IEnumerable
类型,都可以在
IQueryProvider
和静态
Queryable
类中使用


另一个有趣的是
System.Collections.Concurrent
命名空间

public interface IProducerConsumerCollection<T> : IEnumerable<T>, ICollection
公共接口IProducerConsumerCollection:IEnumerable,ICollection
这很有趣,因为它继承自
ICollection
(非泛型)和
IEnumerable
,这两个元素都继承自
IEnumerable
。当然,这不是问题,但这是另一个很好的例子。如果
IProducerConsumerCollection
继承自
ICollection
,而不是它的非泛型对应项,我确信它不会显式继承自
IEnumerable
。它具有
ICollection
中定义的size、(旧)枚举数和同步方法行为,以及
IEnumerable
中定义的通用枚举行为


有两个例子。我发现了更多,但我认为这些可能已经足够了。

MySepcialInterface
这应该是既可克隆又可比较的?是的,但我正在寻找一个真正的理由来扩展两个不相关的接口。正如我上面提到的,我发现的Java示例是“标记”,而我发现的.NET示例已经通过单一继承实现了。没有多个接口继承,任何设计都不可能实现,甚至很难实现。这种做法只是促进了关注点的分离和分离,这当然不是工作的强制性要求(只是让它更干净)。你能举个例子说明你什么时候真的想这样做吗?似乎comparable将是一个有价值的、可支配的资源参考。我熟悉ISP和SOLID原则,大体上我同意他们。我正在寻找一些例子,如果没有多接口继承,设计将很困难或不可能。您给出的例子都是实现多接口的类。我正在寻找扩展多个接口的接口示例。我
IMine: ICollection<T>, IEnumerable<T>, IEnumerable
public interface IQueryable<out T> : IEnumerable<T>, IQueryable {}
public interface IOrderedQueryable<out T> : IQueryable<T>, IOrderedQueryable {}
public interface IProducerConsumerCollection<T> : IEnumerable<T>, ICollection