C#接口(interface)实现关系只是 "Can-Do"关系?

标签 c# inheritance interface liskov-substitution-principle

今天有人告诉我,C#中的接口(interface)实现只是“Can-Do”关系,而不是“Is-A”关系。这与我长期以来信奉的LSP(Liskov Substitution Principle)有冲突。我一直认为所有的继承都应该意味着“Is-A”关系。

所以,如果接口(interface)实现只是一个“Can-Do”的关系。如果有一个接口(interface)“IHuman”和“IEngineer”,一个类“Programmer”继承自“IHuman”和“IEngineer”怎么办?当然,“程序员”是“IHuman”和“IEngineer”。

如果只是“Can-Do”关系,是否意味着我们不能期望“Programmer”实例行为在被视为 IHuman 和 IEngineer 时可能有所不同?

最佳答案

根据我的经验,考虑"is"和“可以”的关系并没有多大帮助。你很快就会遇到问题。基本上,这是现实世界和 OO 之间的阻抗不匹配。无论实际上有多少人谈论对现实世界建模,您都需要从根本上了解类型之间的关系在您使用的平台上意味着什么。

有时接口(interface)可以用作功能,有时它们可​​以表示更多正常的“is-a”关系。我不会太在意它 - 只要确保您了解他们可以做什么和不能做什么。

关于C#接口(interface)实现关系只是 "Can-Do"关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/255644/

相关文章:

java - 接口(interface)和实现的名称,哪个更好?

c# - 如何在C#中使用Nest(Elasticsearch)获取一个索引的所有类型

java - 在实现类中将接口(interface)的返回值限制在一个范围内

c# - 如何使用 xamarin.forms 在弹出窗口中创建表单?

c# - 这段 C# 代码中的冒号是什么意思?

c++ - 为什么从具体类派生是一个糟糕的设计

c++ - SWIG 支持继承静态成员函数

c++ - 如何通过交叉广播恢复接口(interface)

c# - NHibernate - QueryOver 子行作为逗号分隔值

c# - 将 Entity Framework 对象绑定(bind)到 Datagridview C#