假设以下代码:
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
这个概念当然是完整记录的,不应该引起任何问题。但是,我想知道是否可以通过语言本身来传达这一点。就像有一个抽象类,但对于接口。
您可能会问为什么不简单地使用抽象类。原因是我们不想强加从我们的类继承的要求。