package main
import "fmt"
// 类名,结构体大写,表示其他包也能访问
type Avatar struct { //角色
// 同理,如果类的属性大写,则其他包也能访问,否则只能本包中访问
Name string
Ad int
Level int
}
func (Av *Avatar) Show() {
fmt.Println("Avatar = ", Av)
/*
fmt.Println("Name = ", Av.Name)
fmt.Println("Ad = ", Av.Ad)
fmt.Println("Level = ", Av.Level)
*/
}
func (Av *Avatar) GetName() string { //Av 即简写
return Av.Name
}
func (Av *Avatar) SetName(newName string) {
// 如果是(Av Avatar) 则 Av 是一个拷贝,副本。调用该方法的对象的副本。所以要换成指针
Av.Name = newName
}
func main() {
// 实例化,创建一个对象 //根据定义的结构体类型来分配内存并初始化该对象的过程
av := Avatar{Name: "XingGanNM", Ad: 996, Level: 17}
av.Show()
// 改不了
av.SetName("Laowang")
av.Show()
}
继承:
package main
import "fmt"
type Human struct { //角色
name string
sex string
}
func (this *Human) Eat() {
fmt.Println("Human.Eat()")
}
func (this *Human) Walk() { //this 即结构体的简写
fmt.Println("Human.Walk()")
}
type SSRHuman struct {
Human //SSRHuman 继承了Human类方法
level int
}
//重定义父类的方法Eat()
func (this *SSRHuman) Eat() {
fmt.Println("SSRHuman.Eat()...")
}
//子类新方法
func (this *SSRHuman) Fly() {
fmt.Println("SSRHuman.Fly()...")
}
func main() {
h := Human{"Li4", "male"}
h.Eat()
h.Walk()
//定义一个子类对象
var s SSRHuman
s.name = "Wang5"
s.sex = "female"
s.level = 30
//s := SSRHuman{Human{"Wang5", "female"}, 30}
s.Walk()
s.Eat()
s.Fly()
}
输出:
Human.Eat()
Human.Walk()
Human.Walk()
SSRHuman.Eat()...
SSRHuman.Fly()...
多态。父类的接口有很多方法,子类继承和实现重写这些方法,达成抽象接口有不同多态的表达形式
多态是面向对象编程中的一个重要概念,它允许不同的对象以不同的方式对同一个方法进行实现。在Go语言中,多态可以通过接口来实现。
首先,定义一个接口,该接口包含多个方法:
type Shape interface {
Area() float64
Perimeter() float64
}
然后,可以创建多个结构体类型,它们都实现了Shape接口的方法:
type Rectangle struct {
width float64
height float64
}
func (r Rectangle) Area() float64 {
return r.width * r.height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.width + r.height)
}
type Circle struct {
radius float64
}
func (c Circle) Area() float64 {
return math.Pi * c.radius * c.radius
}
func (c Circle) Perimeter() float64 {
return 2 * math.Pi * c.radius
}
接下来,可以创建一个函数,该函数接受一个Shape类型的参数,并调用该参数的方法:
func PrintShapeDetails(s Shape) {
fmt.Printf("Area: %.2f\n", s.Area())
fmt.Printf("Perimeter: %.2f\n", s.Perimeter())
}
通过上述代码,可以实现多态的效果。当传递一个Rectangle类型的对象给PrintShapeDetails函数时,它会调用Rectangle类型的Area和Perimeter方法。同样,当传递一个Circle类型的对象时,它会调用Circle类型的方法。
扩展多态的方式可以是创建更多实现Shape接口的结构体类型,每个结构体类型都可以提供自己特定的实现方式。这样,可以根据需要创建不同的对象,并以统一的方式对它们进行操作。