我们都知道,面向对象的三个要素:封装,继承,多态。而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大家肯定再熟悉不过了。