作者回复: Go 是把多个编程范式有机地融合在一起了。继承其实是很容易引起程序复杂度飙升的一个东西。GoF 提倡的设计原则中也有“多用组合,少用继承”一条。这不正是 Go 所做的嘛?组合和继承是两个不同的东西,虽然它们在某些时候可以起到同样的作用。
我觉得纯粹的 OO 有利有弊,而且不能说没有完全实现OO 的所有思想就不算支持 OO。
作者回复: 嗯,对。
作者回复: 看过设计模式的书吗?其中有一条原则:多用组合,少用继承。这样才能低耦合。另外可以结合“组合模式”思考一下。
作者回复: 当值(比如这里说的cat)的方法集合中没有对应方法时,Go会去它的指针的方法集合中寻找,如果找到了,那么Go就会做这种转译。其他情况不会做转译。这属于一种语法糖,让我们能用同一种调用方式调用两种方法(值方法或指针方法)。
作者回复: 方法的声明形式是:func (xx XX) methodName() {...},其中的 (xx XX) 是接收者声明。这个接收者就是某个类型 XX 啊,xx 是它被实例化后的指代变量。XX 叫接收者类型,xx 叫接收者变量。这就是方法与函数的区别啊。方法必须依附于某个类型,而函数不用,函数是独立的。调用方法的话,只能通过该方法依附的那个类型的某个实例去调用,比如:xx1.methodName()。而函数可以直接调用。
这些在你问的问题里基本都表述出来了。你没有察觉到吗?
作者回复: 嵌入结构体可以部分实现继承的效果。
作者回复: 别着急,思考题答案我会在后边补发。不过可能要耗费一些时间。