moh*_*666 3 python inheritance go
我是一名Python开发人员,正在努力学习Go.目前我正在尝试重构我的第一个小项目,但我不太确定如何在结构之间共享方法.
长话短说,你会怎么做Go这样的Python代码呢?
class Super(object):
def CommonMethod(self):
print 'I am the common method.'
class One(Super):
def MethodOne(self):
self.CommonMethod()
print 'I am method one.'
class Two(Super):
def MethodTwo(self):
self.CommonMethod()
print 'I am method two.'
one = One()
one.MethodOne()
two = Two()
two.MethodTwo()
Run Code Online (Sandbox Code Playgroud)
TL; DR
在Go中,方法不仅像在Python或Java等其他语言中那样神奇地继承子类.您可以定义接口并使用嵌入,但您必须实现每种类型所需的方法.当然你可以从外部方法调用嵌入的方法,但要小心内部对象而不是外部对象会发生任何更改.
来自文档:
嵌入与子类化不同的重要方法.当我们嵌入一个类型时,该类型的方法成为外部类型的方法,但是当它们被调用时,方法的接收者是内部类型,而不是外部类型.在我们的例子中,当调用
Reada 的方法时bufio.ReadWriter,它与上面写出的转发方法具有完全相同的效果; 接收器是读者领域,而ReadWriter不是ReadWriter自身.
更多信息
以下是文档的一些参考资料:
http://golang.org/doc/faq#Is_Go_an_object-oriented_language
Go是一种面向对象的语言吗?
是的,不是.尽管Go具有类型和方法,并且允许面向对象的编程风格,但是没有类型层次结构.Go中"接口"的概念提供了一种我们认为易于使用且在某些方面更为通用的不同方法.还有一些方法可以将类型嵌入到其他类型中,以提供类似但不完全相同的子类化.
因此,您可以使用接口来定义应在类型中实现的内容,但是您必须为每种类型实现这些方法.
您拥有的一个便利是嵌入:
http://golang.org/doc/effective_go.html#embedding
Go不提供典型的,类型驱动的子类化概念,但它确实能够通过在结构或接口中嵌入类型来"借用"实现的各个部分.
界面嵌入非常简单.我们之前提到过
io.Reader和io.Writer接口; 这是他们的定义.
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
Run Code Online (Sandbox Code Playgroud)
io包还导出了几个其他接口,这些接口指定了可以实现多个这样的方法的对象.例如,有
io.ReadWriter一个包含Read和的接口Write.我们可以io.ReadWriter通过明确地列出这两个方法来指定,但是将两个接口嵌入以形成新接口更容易也更令人回味,如下所示:
// ReadWriter is the interface that combines the Reader and Writer interfaces.
type ReadWriter interface {
Reader
Writer
}
Run Code Online (Sandbox Code Playgroud)