用golang来面向对象编程

我们都知道,面向对象的三个要素:封装,继承,多态。而golang其实不能称之为严格意义上面向对象的语言,但我今天在网上翻阅到一篇用golang来写面向对象代码的文章,提供了一个思路,是英文的,这里我把它翻译了一下,供大家和自己参考。

先送上传送门:http://yourbasic.org/golang/inheritance-object-oriented/

翻译:

传统的面向对象编程中提供了三个特性。当 Dog 从 Animal 继承

1,该Dog将重用Animal的代码。
2,x 类型的变量Animal可以指a Dog或a Animal,即基类可以指向子类。
3,x.Eat()将Eat根据什么类型的对象x引用来选择一种方法,即多态性。

在面向对象的行话来说,这些特征被称为代码重用,多态性和动态调度。

所有这些都可以在Go中使用,使用方式如下:

1,组合和嵌入 来实现代码重用。
2,interface 来实现多态性和动态分配。

组合

type Animal struct {
    // …
}

type Dog struct {
    beast Animal
    // …
}

嵌入

type Animal struct {
    // …
}

func (a *Animal) Eat()   { … }
func (a *Animal) Sleep() { … }
func (a *Animal) Breed() { … }

type Dog struct {
    beast Animal
    // …
}

func (a *Dog) Eat()   { a.beast.Eat() }
func (a *Dog) Sleep() { a.beast.Sleep() }
func (a *Dog) Breed() { a.beast.Breed() }

这样通过组合和嵌入,实现了Dog对Animal成员变量和成员方法的继承,虽然写起来有些繁琐。

interface

type Sleeper interface {
    Sleep()
}

func main() {
    pets := []Sleeper{new(Cat), new(Dog)}
    for _, x := range pets {
        x.Sleep()
    }
}

翻译完毕。

我觉得前半段,即组合和嵌入可以给我们未来如果要用面向对象的思想去写go的话,提供了个不错的想法。后半段interface大家肯定再熟悉不过了。

猜你喜欢

转载自blog.csdn.net/jeffrey11223/article/details/79476351