C#中的"抽象"界面

Rei*_*l-- 18 c# abstract-class interface

这是一个学术问题. 可以说它背后有一个XY问题,我可以稍后单独发布.但我真正的学术问题特别感兴趣,在这里.


我经常发现我有一组接口,它们都有共同的属性.我想要定义一个基本接口以使其共同化,部分原因是缺乏重复,部分原因是我可以在不知道确切类型的情况下传递对象并使用常用方法.

也许我有IFooRepository,IBarRepository等等,我可以宣布IRepository<TEntity>.

或者我有IHappyBot,ISadBot,IConfusedBot,都具有IBot共同点.

值得注意的是,没有一个类可以直接实现这些基本接口 - 你永远不会有一些只能 实现的东西IBot.

如果我们在讨论的层次结构而不是接口,那么我会说"啊......基本的东西是抽象类".

有什么类似的东西我可以用接口来记录IBot不会直接实现的期望.

我感兴趣的一个方面是做一些你以后可以通过反射检测的东西,这样当我测试我的DI设置时,我可以说"啊,这个界面不应该是可绑定的,因为它是"抽象的" .


我主要关心C#,但是如果这个功能特别存在于其他主要语言中,那么听到它会很有趣.

Dav*_*d E 10

也许是一个回答的哲学问题 - 但是如果一个班级想要的话,为什么不能实施IBot呢?

抽象类怎么样?我可能想要一个抽象基础Bot类来实现IBot,以检查Bot基类是否记录了基本Bot所需的所有功能.

接口是关于定义什么可以/应该做什么,它是一个功能列表.在我看来,说"某些东西不能声称它满足这个功能列表"没有多大意义.

抽象类是有意义的,因为有时抽象类需要填充实现漏洞(抽象方法等).接口不是这种情况.


Ric*_*ich 5

我不这么认为,接口的实现细节是故意隐藏在他们的合作者之间的.允许接口契约指定接口的实现细节将混合隐喻,似乎没有意义.

如果你真的想要实现这一点,你可以引入一个标记属性类[AbstractInterface],但我认为它的用途非常有限(并且可疑).

你的激励例子,DI系统需要知道接口是直接实现还是通过超级接口实现,这似乎让我无法理解.我想,DI系统可以只寻找实现.

  • 但是在您的DI示例中,您真正要说的是"我目前不打算将此接口用作注入参数的类型".但这不是接口的属性或实现它的类 - 它是项目中所有其他代码的属性.您所描述的"抽象接口"不会阻止您尝试创建基接口的注入参数,这会让您打开另一种无效的DI配置 (2认同)