开篇先抛出问题,Go语言算不算是一门面向对象编程语言?
要回答这个问题,我查阅了许多的外文资料,发现对于面向对象编程语言,并不存在一个严格的定义。
但从实际的角度出发,只要一门语言拥有类,对象的概念,以及提供了对应的语法,就可以用来实现面向对象编程了,所以从这个角度来看,Go语言是可以被认为是一门面向对象编程语言的。
那么抛出第二个问题,Go语言有没有实现面向对象的四大特性? 封装,抽象,继承,多态?
这个问题我不准备全部回答,但关于「多态」,Go语言很明确地提供了非常灵活的语法支持。
本篇文章通过Go的多态实现思路,来探讨如何理解「多态」,以及如何真正地在项目中使用,而不是随处可见的「小狗,动物,吠」这种虽然浅显易懂但不够实际落地的例子。
一,多态是什么?
多态的定义比较抽象,这里我贴一下百度词条的
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。
还是用具体的例子来理解吧,Go的fmt包相信大家都用过,其中fmt.Printf()更是常用的函数,我们先跳到fmt包里,去看一眼这个方法
// Fprintf formats according to a format specifier and writes to w.
// It returns the number of bytes written and any write error encountered.
func Fprintf(w io.Writer, format string, a ...interface{
}) (n int, err error) {
p := newPrinter()
p.doPrintf(format, a)
n, err = w.Write(p.buf)
p.free()
return