oop - 我应该使用继承吗?

标签 oop inheritance class-design

这更像是一个主观问题,所以我将抢先将其标记为社区 wiki。

基本上,我发现在我的大部分代码中,有很多类,其中很多是相互使用的,但很少有直接相互关联的。回首我的大学时光,想起传统的 class Cat : Animal类型示例,你有巨大的继承树,但我在我的代码中没有看到这些。我的类图看起来像巨大的蜘蛛网,不像漂亮的树。

我觉得我在逻辑上分离信息方面做得很好,最近我在通过 DI/IoC 技术隔离类之间的依赖关系方面做得很好,但我担心我可能会遗漏一些东西。我确实倾向于在接口(interface)中聚集行为,但我根本不子类化。

我可以根据 class Dog : Animal 等传统示例轻松理解子类化。或 class Employee : Person ,但我根本没有任何明显的事情要处理。事情很少像 class Label : Control 那样清晰。 .但是当涉及到在我的代码中将真实实体建模为层次结构时,我不知道从哪里开始。

所以,我想我的问题可以归结为:

  • 可以简单地不继承或继承吗?我应该担心吗?
  • 您必须采取哪些策略来确定可以从继承中受益的对象?
  • 总是基于行为(接口(interface))而不是实际类型继承是否可以接受?
  • 最佳答案

    继承应始终表示“is-a”关系。如果 A 从 B 派生,您应该能够说“A is a B”。如果不是,则更喜欢组合。没有必要时不子类化是完全可以的。

    例如,说 FileOpenDialog "is"Window有道理,但是说 Engine "is"Car是胡说八道。在这种情况下,Engine 的实例在 Car 内instance 更合适(可以说 Car "is-implemented-in-terms-of"Engine )。

    有关继承的详细讨论,请参阅 Part 1Part 2 gotw.ca 上的“继承的使用和滥用”。

    关于oop - 我应该使用继承吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311964/

    相关文章:

    Javascript 不继承原型(prototype)属性

    c++ - 继承函数的重载解决方案

    design-patterns - 从用例到类图 - 我该怎么做?

    oop - 策略模式和访问者模式有什么区别?

    c++ - 我怎么知道临时对象何时被创建和销毁?

    c++ - 根据实例数自动设置ID

    asp.net - NHibernate 继承类但无需持久化

    wpf - WPF MVVM设计问题

    c++ - 我应该如何在 C++ 中装箱整数类型?

    php - Mysql连接类