【发布时间】:2017-01-13 21:45:01
【问题描述】:
我注意到在过去 10 年左右的时间里放弃我在 Java 和 PHP 中使用的 OOP 风格编程是多么困难。几周以来,我一直在尝试使用 golang(双关语),但我试图让组合比 golang 的继承原则更自然。
我将如何定义一个有用的接口来确保所有这些结构都可以实现它?我试图想出一个有用的例子,它不涉及狗、人类或奇怪的车辆结构......
package main
type Store struct {
name string
phone string
}
type HardwareStore struct{ Store }
type FoodStore struct{ Store }
type OnlineStore struct {
Store
url string
}
我认为这可能是因为我的思考基于他们的状态/数据而不是他们的行为,我有点挣扎。
明显的首选,没有接口,可能是这个(简化的),当然失败了:
s := Store{}
h := HardwareStore{}
f := FoodStore{}
o := OnlineStore{}
stores := []Store{s, h, f, o}
【问题讨论】:
-
这听起来仍然像你在尝试继承之类的东西,这在 Go 中不会很好地工作。你有什么具体的问题要解决吗?
-
是的,它围绕着具有不同属性的用户,具体取决于用户的类型,我试图远离继承以在惯用的 go 中做到这一点。
-
通常在从基于继承的 OOP 转移时,您可以“反转”逻辑。与其拥有不同“类型”的用户,不如使用具有区分它们的属性的用户类型。您还可以基于行为everything,并简单地定义返回您感兴趣的字段的方法,并使用方法集来定义接口。很难说最适合您正在解决的问题的人为示例。
-
如何使用接口?解耦代码。见stackoverflow.com/a/62297796/12817546。 “动态”调用方法。见stackoverflow.com/a/62336440/12817546。访问 Go 包。见stackoverflow.com/a/62278078/12817546。将任何值分配给变量。见stackoverflow.com/a/62337836/12817546。
标签: inheritance go polymorphism