Golang 继承

Golang 继承

案例引入

type Person struct {
	Name string
	Age  int
}
//Go继承使用匿名嵌套
type Student struct {
	Person
	sNo int
}
func (person *Person) say() {
	fmt.Println("person say")
}
func (person *Person) talk() {
	fmt.Println("person talk")
}
func (student *Student) work() {
	fmt.Println("student work")
}
//重写Person talk 方法
func (student *Student) talk() {
	fmt.Println("student talk")
}
func main() {
	student := Student{Person{
		"小明", 12,
	}, 12}
	student.say()
	student.work()
	student.talk()
	//匿名结构体字段可以简化访问
	fmt.Print(student.Name)
}

注意事项

  1. 结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段,方法,都可以使用

  2. 匿名结构体字段访问可以简化

  3. 当结构体和匿名结构体有相同的字段或则方法时, 采用就近原则访问, 如果希望访问匿名结构体的字段和方法, 可以通过匿名结构体名来区分

    	student.talk()
    	//通过字段访问匿名结构体的方法
    	student.Person.talk()
    
  4. 结构体嵌入多个匿名结构体(多重继承), 如果两个匿名结构体有相同的字段和方法(同时结构体本身没有相同的字段和方法), 在访问时, 就必须指明匿名结构体名字,否则编译报错

    type Person struct {
    	Name string
    	Age  int
    }
    type Student struct {
    	Name string
    }
    type xueza struct {
    	Student
    	Person
    }
    func main() {
    	x := xueza{Student{"zs"},
    		Person{"ls", 10}}
    	x.Name //报错
    }
    
  5. 如果一个结构体嵌套了一个有名的结构体,这种模式就是组合, 如果时组合关系, 那么在访问组合的结构体的字段或方法时, 必须带上结构体的名字, 类似于Java中的嵌套类

    type Person struct {
    	Name string
    	Age  int
    }
    type Student struct {
    	p   Person
    	sNo int
    }
    func main() {
    	s := &Student{Person{"zs", 10}, 10}
    	//不能通过s.Name访问
    	fmt.Println(s.p.Name)
    }
    

特殊案例

GO支持匿名基本类型, 但是只能有一个相同类型的

type Student struct {
	int //go支持匿名基本类型
	sNo int
}
func main() {
	s := &Student{10, 20}
	fmt.Println(s)
}
posted @ 2020-08-12 15:47  CyberPelican  阅读(540)  评论(0编辑  收藏  举报