golang面向对象特性

栏目: Go · 发布时间: 6年前

内容简介:和其他高级语言一样,golang 也支持面向对象编程,支持得比较简单,有些特性并不支持,但是够用了接口接口使用 interface 关键字声明,任何实现接口定义方法的类都可以实例化该接口,接口和实现类之间没有任何依赖,你可以实现一个新的类当做 Sayer 来使用,而不需要依赖 Sayer 接口,也可以为已有的类创建一个新的接口,而不需要修改任何已有的代码,和其他静态语言相比,这可以算是 golang 的特色了吧

和其他高级语言一样,golang 也支持面向对象编程,支持得比较简单,有些特性并不支持,但是够用了

接口

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

type Sayer interface {
 Say(message string)
 SayHi()
}

继承

继承使用组合的方式实现

type Animal struct {
 Name string
}

func (a *Animal) Say(message string) {
    fmt.Printf("Animal[%v] say: %v\n", a.Name, message)
}

type Dog struct {
 Animal
}

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

覆盖

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

// override Animal.Say
func (d *Dog) Say(message string) {
    fmt.Printf("Dog[%v] say: %v\n", d.Name, message)
}

Dog.Say 将覆盖 Animal.Say

多态

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

var sayer Sayer

sayer = &Dog{Animal{Name: "Yoda"}}
sayer.Say("hello world")

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

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

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

func (a *Animal) Say(message string) {
    fmt.Printf("Animal[%v] say: %v\n", a.Name, message)
}

func (a *Animal) SayHi() {
    a.Say("Hi")
}

func (d *Dog) Say(message string) {
    fmt.Printf("Dog[%v] say: %v\n", d.Name, message)
}

func main() {
 var sayer Sayer

    sayer = &Dog{Animal{Name: "Yoda"}}
    sayer.Say("hello world") // Dog[Yoda] say: hello world
    sayer.SayHi() // Animal[Yoda] say: Hi
}

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

func SayHi(s Sayer) {
    s.Say("Hi")
}

type Cat struct {
 Animal
}

func (c *Cat) Say(message string) {
    fmt.Printf("Cat[%v] say: %v\n", c.Name, message)
}

func (c *Cat) SayHi() {
 SayHi(c)
}

func main() {
 var sayer Sayer

    sayer = &Cat{Animal{Name: "Jerry"}}
    sayer.Say("hello world") // Cat[Jerry] say: hello world
    sayer.SayHi() // Cat[Jerry] say: Hi
}

添加客服微信:grey0805,共享更多精彩


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Clean Code

Clean Code

Robert C. Martin / Prentice Hall / 2008-8-11 / USD 49.99

Even bad code can function. But if code isn’t clean, it can bring a development organization to its knees. Every year, countless hours and significant resources are lost because of poorly written code......一起来看看 《Clean Code》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具