inheritance - 处理 Go 中缺乏继承的最佳实践

标签 inheritance go modeling

我正要开始编写一个新的应用程序,我正在考虑用 Go 编程,但我没有这方面的经验。由于 Go 不支持继承,我如何忠实地将这样的域翻译成 Go,同时仍然符合 Go 的哲学?:

  • 一个人有 2 条腿和 2 条胳膊,可以走路。
  • 音乐家是一个人,有乐器并且可以演奏,有分区并且可以阅读。但没有人只能是音乐家,因为音乐家拥有并会演奏特定的乐器。
  • fiddle 手是拥有 fiddle 并会拉 fiddle 的音乐家
  • 钢琴家是拥有钢琴并会弹奏钢琴的音乐家。
  • 当一个 fiddle 手/钢琴家走在街上时,每个人都只把他看作一个人。

也许我们可以像这样重新构造域以删除任何"is"关系,以便它可以翻译成 Go:

  • fiddle 手有一个人的部分,一个音乐家的部分,一把 fiddle ,并且会拉 fiddle
  • fiddle 家/钢琴家的音乐家部分有分区并且可以读取它们
  • 当一个 fiddle 家/钢琴家走在大街上,大家只能看到他的部分
  • 等等

在翻译成 Go 之前,像这样对这样的域建模是最佳实践吗?当 Go 的作者决定在 Go 中排除继承时,他们是否希望他们的用户拥有这种思维方式?

最佳答案

这不是“Go 的作者希望他们的用户拥有的思维方式”; Go 没有继承,因为它不是面向对象的语言,就像 C 没有继承一样。

它确实有组合和接口(interface),这是你所描述的建模所需要的:一个“有”另一个对象的对象应该有一个该类型(组合)的字段,以及一个“可以”的对象执行某些操作可以通过接口(interface)建模。

但是,如果它描述的是一个实际的编程问题而不是一个比喻,那么这个问题可能更容易回答;当然,除非您的应用程序打算模拟各种音乐家的肢体和乐器。

关于inheritance - 处理 Go 中缺乏继承的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47715754/

相关文章:

javascript - 如何直接调用对象父类的setter?

c# - Entity Framework 6 (EF6) 中每个具体类型的表 (TPC) 继承

javascript - 通过继承 React.js 中的值来更改复选框的值

go - 如何从 map 中获取值

asp.net-mvc - 你如何在 asp.net-mvc 中组织你的模型代码?

python - 使用基类的属性/属性作为表列?

database - boltdb 是否支持并发查询来读取和更新数据库?

mysql - Gorm不遵守many2many说明符

workflow - 如何表示由系统自动化的 BPMN 工作流的一部分?

java - 模型对象应该有接口(interface)吗?