我今天在模块开卷考试结束时遇到了这个问题,发现自己迷路了.我正在阅读Head first Java,两个定义似乎完全相同.我只是想知道主要区别在于我自己的想法.我知道有很多类似的问题,但是,我没有看到哪些提供了明确的答案.
这个问题不是 "遗产与构成"之类的问题.
我完全理解继承与组合有什么不同,我知道Liskov替换原理,钻石问题,它们的优点和缺点以及这两个概念似乎都很简单.但到处都有关于继承和构成的问题,我想,也许我误解了这个简单的想法.
让我们关注Go.Go是一种来自谷歌的语言,每个人都很兴奋它没有继承,它没有类,但它有组成,这很酷.对我来说,Go中的组合为您提供与其他语言(C++,Java,...)中的继承完全相同的功能 - 组件方法会自动公开并作为后续结构的方法提供,如下所示:
package main
import (
"fmt"
)
type Car struct{
name string
}
func (c *Car) move() bool {
return true
}
type MyCar struct{
Car
}
func main() {
var c MyCar
fmt.Print(c.move())
}
Run Code Online (Sandbox Code Playgroud)
所以总结一下,组合比继承更好,因为:
如果您考虑Go及其接口(每个对象,具有接口定义的方法,实现此接口隐含),您是否拥有最终解决方案?我们可以说含有一些语法糖的成分可以代替遗传吗?
这种设计符合Liskov替代原则.我是否会遗漏某些内容或继承(从任何语言中获知)与Go中已知的组合(和接口)相比没有优势?
===== edit1 =====
为了澄清,可以Go使用"标准"组合机制,就像这样(这个例子的行为与前一个一样):
package main
import (
"fmt"
)
type Car struct{
name string
}
func (c *Car) move() bool {
return true …Run Code Online (Sandbox Code Playgroud) language-agnostic oop inheritance design-patterns composition