假设以下代码:
namespace Example {
  public interface IBase {
    string CommonMember { get; set; }
  }
  public interface IDerived : IBase {
    void DoSomething();
  }
  public interface IComplexDerived : IBase {
    IEnumerable<object> Junk { get; }
  }
}
我目前正在从事的项目中有类似的结构。该接口的IBase主要目的是能够将实例保存在IDerived同IComplexDerived一个容器中(如 a List<IBase>),并且不必重复常见的接口成员定义(如CommonMember示例中所示)。
然后使用它的一种方法是这样的:
public class Foo {
  public void Bar( IEnumerable<IBase> instances ) {
    foreach( IBase instance in instances ) {
      if( instance is IDerived ) { /* do something */ } 
      else if( instance is IComplexDerived ) {  /* do something else */ }
    }
  }
}
因此,没有什么可以阻止用户实现IBase该类的实例并将其传递到系统中。但是这样做是完全没有用的,因为整个库只希望处理实现从.IBase
这个概念当然是完整记录的,不应该引起任何问题。但是,我想知道是否可以通过语言本身来传达这一点。就像有一个抽象类,但对于接口。
您可能会问为什么不简单地使用抽象类。原因是我们不想强加从我们的类继承的要求。