我正要开始编写一个新的应用程序,我正在考虑用 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/