package main
import "fmt"
type Super struct{}
func (super *Super) name() string {
return "Super"
}
func (super *Super) WhoAmI() {
fmt.Printf("I'm %s.\n", super.name())
}
type Sub struct {
Super
}
func (sub *Sub) name() string {
return "Sub"
}
func main() {
sub := &Sub{Super{}}
sub.WhoAmI()
}
Run Code Online (Sandbox Code Playgroud)
我想得到"我是Sub",但我得到的是"我是超级的".
我已经知道sub.WhoAmI将调用sub.Super.WhoAmI,但我仍然想知道是否有办法获得"我是Sub".在Python中,当我编写以下代码时:
class Super(object):
def name(self):
return "Super"
def WhoAmI(self):
print("I'm {name}".format(name=self.name()))
class Sub(Super):
def name(self):
return "Sub"
if __name__ == "__main__":
sub = Sub()
sub.WhoAmI()
Run Code Online (Sandbox Code Playgroud)
我可以得到"我是Sub".
嵌入不是子类化.Go中没有超类或子类.Sub这里不是"孩子" Super.它包含一个Super.你无法做到.您需要以不同的方式组织代码,以便不需要它.
例如,这里(playground)是一种更自然的方式在Go中执行此操作:
package main
import "fmt"
type Namer interface {
Name() string
}
type Super struct{}
func (sub *Super) Name() string {
return "Super"
}
type Sub struct{}
func (sub *Sub) Name() string {
return "Sub"
}
func WhoAmI(namer Namer) {
fmt.Printf("I'm %s.\n", namer.Name())
}
func main() {
sub := &Sub{}
WhoAmI(sub)
}
Run Code Online (Sandbox Code Playgroud)
这个重点放在接口上,而不是专注于类(Go没有).这不是什么问题的事情是,这是他们能有什么问题做.这是一种非常强大的编程方法,在实践中通常比继承抽象更灵活,更不容易出错.
| 归档时间: |
|
| 查看次数: |
978 次 |
| 最近记录: |