Go语言实现面向对象
<h1>单元目标</h1>
<p>其实在Go语言中是没有面向对象的,但是Go语言的语法设计,我们可以借助结构体,方法,接口的实现,来模拟其他语言中的面向对象的概念。首先了解一下什么是面向对象,面向对象中的三大特征是:</p>
<ul>
<li><code>封装</code> 在意义上是把许多客观的事物封装成一个抽象的类,把自己的属性 方法只让可信的对象操作。</li>
<li><code>继承</code> 子类可以访问父类的属性和方法,子类也可以拥有自己的属性和方法。子类可以重写父类的方法。</li>
<li><code>多态</code> 是指一个程序中同名的方法共存的情况,调用者只需使用同一个方法名,系统会根据不同情况,调用相应的不同方法,从而实现不同的功能。多态性又被称为“一个名字,多个方法”。</li>
</ul>
<h1>使用结构体来实现封装</h1>
<p>Go语言中没有像java或者.net中的class类,不过可以把struct结构体看成一个类,结构体如果用面向对象的思维来理解,结构体把字段封装到一起,数据被保护在结构体内部,程序需要访问字段的时候,需要通过结构体来访问。</p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=0999d9dc5a1bc62e52fd6efd7d8f6ce0&file=file.png" alt="" /></p>
<pre><code class="language-go">package main
import (
"fmt"
)
// 定义结构体实现封装
type Haojiahuo struct {
Name string
Age int
}
//使用NewPerson方法创建一个对象
func NewPerson(name string) *Haojiahuo {
return &Haojiahuo{
Name: name,
}
}
// 使用SetAge方法设置结构体成员的Age
func (h *Haojiahuo) SetAge(age int) {
h.Age = age
}
// 使用GetAge方法获取成员现在的Age
func (h *Haojiahuo) GetAge() int {
return h.Age
}
func main() {
//创建一个对象
h := NewPerson("好家伙")
h.SetAge(18) //访问封装的方法设置年龄
fmt.Println(h.Name, h.GetAge()) //使用对象封装的方法获取年龄
}</code></pre>
<h1>继承的实现</h1>
<p>继承可以解决代码复用的问题,结构体内嵌套一个匿名结构体,也可以嵌套多层结构体。</p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=0adde3b8874f946ed7ef32ff097de5c3&file=file.png" alt="" /></p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=f2da29fe032ba6629ed0c55f4115ae27&file=file.png" alt="" /></p>
<pre><code class="language-go">package main
import (
"fmt"
)
// 创建一个结构体起名 Ouyangcrazy 代表父类
type Ouyangcrazy struct {
Name string
Age int
Ability string
}
//创建一个结构体代表子类
type YangGuo struct {
Ouyangcrazy //包含父类所有属性
Address string //单独子类有的字段
}
// 父类的方法
func (o *Ouyangcrazy) ToadKongfu() {
fmt.Println(o.Name, "的蛤蟆功!")
}
//子类的方法
func (y *YangGuo) NewKongfu() {
fmt.Println(y.Name, "子类自己的新功夫!")
}
//子类重写父类的方法
// func (y *YangGuo) ToadKongfu() {
// fmt.Println(y.Name, "的新蛤蟆功!")
// }
func main() {
o := &Ouyangcrazy{Name: "欧阳疯", Age: 70} //创建父类
o.ToadKongfu() //父类对象访问父类方法
y := &YangGuo{Ouyangcrazy{Name: "杨过", Age: 18}, "古墓"} //创建子类
fmt.Println(y.Name) //子类对象访问父类中有的字段
fmt.Println(y.Address) //子类访问自己的字段
y.ToadKongfu() //子类对象访问父类方法
y.NewKongfu() //子类访问自己的方法
//y.ToadKongfu() //如果存在自己的方法 访问自己重写的方法
}</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ef451deac60a611c09aa7ace41b9cabf&file=file.png" alt="" /></p>