美文网首页我爱编程
golang 面向对象特性

golang 面向对象特性

作者: hatlonely | 来源:发表于2018-06-19 19:12 被阅读0次

和其他高级语言一样,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
}

参考链接

转载请注明出处
本文链接:http://www.hatlonely.com/2018/06/19/golang-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%89%B9%E6%80%A7/

相关文章

  • golang 面向对象特性

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

  • golang面向对象特性

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

  • Go核心编程-面向对象 [OOP]

    Golang也是支持面向对象(OOP)编程特性的语言,但是Golang中没有类(class),而Go语言的结构体(...

  • Golang中的面向对象特性

    Golang中的面向对象特性 Golang 作为新世纪的C语言,有着与C接近的高性能,有着比C更为简洁的表达,有着...

  • 面向对象编程(二)

    面向对象编程(二) -------面向对象的基本特性 1、面向对象的基本特性 面向对象的编程是把现实客观存在的...

  • 面向对象

    面向对象:OOP 面向对象三大特性

  • Go语言结构体快速入门

    Golang里面没有类,用结构体实现面向对象的编程特性。非常简洁。没有extends,通过匿名字段来实现。Gola...

  • 面向对象语言基础

    面向对象语言的特性 面向对象的语言的特性:封装、继承、多态。 面向对象语言的设计原则 面向对象的语言在进行程序设计...

  • 面向对象三大特性(一):封装

    面向对象有三大特性:封装、继承和多态。注意,是面向对象的三大特性而不是Java的三大特性,Java只是面向对象语言...

  • golang 使用组合的方式实现继承

    摘要 golang并非完全面向对象的程序语言,为了实现面向对象的继承这一神奇的功能,golang允许struct间...

网友评论

    本文标题:golang 面向对象特性

    本文链接:https://www.haomeiwen.com/subject/mbrzeftx.html