Go 的面向对象特性

参考解析

题目来源:腾讯

答案:

和其他高级语言一样,golang 也支持面向对象编程,支持得比较简单,比如继承,封装,多态

接口

接口使用 interface 关键字声明,任何实现接口定义方法的类都可以实例化该接口,接口和实现类之间没有任何依赖,你可以实现一个新的类当做 Sayer 来使用,而不需要依赖 Sayer 接口,也可以为已有的类创建一个新的接口,而不需要修改任何已有的代码,和其他静态语言相比,这可以算是 golang 的特色了吧

  1. type Sayer interface {
  2. Say(message string)
  3. SayHi()
  4. }

继承

继承使用组合的方式实现

  1. type Animal struct {
  2. Name string
  3. }
  4. func (a *Animal) Say(message string) {
  5. fmt.Printf("Animal[%v] say: %v
  6. ", a.Name, message)
  7. }
  8. type Dog struct {
  9. Animal
  10. }

Dog 将继承 Animal 的 Say 方法,以及其成员 Name

覆盖

子类可以重新实现父类的方法

  1. // override Animal.Say
  2. func (d *Dog) Say(message string) {
  3. fmt.Printf("Dog[%v] say: %v
  4. ", d.Name, message)
  5. }

Dog.Say 将覆盖 Animal.Say

多态

接口可以用任何实现该接口的指针来实例化

  1. var sayer Sayer
  2. sayer = &Dog{Animal{Name: "Yoda"}}
  3. sayer.Say("hello world")

但是不支持父类指针指向子类,下面这种写法是不允许的

  1. var animal *Animal
  2. animal = &Dog{Animal{Name: "Yoda"}}

同样子类继承的父类的方法引用的父类的其他方法也没有多态特性

  1. func (a *Animal) Say(message string) {
  2. fmt.Printf("Animal[%v] say: %v
  3. ", a.Name, message)
  4. }
  5. func (a *Animal) SayHi() {
  6. a.Say("Hi")
  7. }
  8. func (d *Dog) Say(message string) {
  9. fmt.Printf("Dog[%v] say: %v
  10. ", d.Name, message)
  11. }
  12. func main() {
  13. var sayer Sayer
  14. sayer = &Dog{Animal{Name: "Yoda"}}
  15. sayer.Say("hello world") // Dog[Yoda] say: hello world
  16. sayer.SayHi() // Animal[Yoda] say: Hi
  17. }

上面这段代码中,子类 Dog 没有实现 SayHi 方法,调用的是从父类 Animal.SayHi,而 Animal.SayHi 调用的是 Animal.Say 而不是Dog.Say,这一点和其他面向对象语言有所区别,需要特别注意,但是可以用下面的方式来实现类似的功能,以提高代码的复用性

  1. func SayHi(s Sayer) {
  2. s.Say("Hi")
  3. }
  4. type Cat struct {
  5. Animal
  6. }
  7. func (c *Cat) Say(message string) {
  8. fmt.Printf("Cat[%v] say: %v
  9. ", c.Name, message)
  10. }
  11. func (c *Cat) SayHi() {
  12. SayHi(c)
  13. }
  14. func main() {
  15. var sayer Sayer
  16. sayer = &Cat{Animal{Name: "Jerry"}}
  17. sayer.Say("hello world") // Cat[Jerry] say: hello world
  18. sayer.SayHi() // Cat[Jerry] say: Hi
  19. }