zoukankan      html  css  js  c++  java
  • Go:面向"对象"

    一、封装

    1. 封装的实现步骤:
    2. 将结构体、字段的首字母小写(不能被导出);
    3. 给结构体所在的包提供一个工厂模式的函数,首字母大写。类似一个构造函数;
    4. 提供一个首字母大写的方法,由于获取结构体属性的值。

    二、继承

    2.1 在 golang 中,如果一个结构体嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承。

    type Animal struct {
    	Name string
    	Age int
    }
    
    type TaiDi struct {
    	Animal // 这就是嵌套匿名结构体Animal
    }
    
    func (a *Animal) Eat() {
    	fmt.Printf("%s今年%d岁,它正在吃东西...", a.Name, a.Age)
    }
    
    func main() {
    	var td TaiDi
    	td.Animal.Name = "泰迪"
    	td.Animal.Age = 1
    	// 可以简化成
    	// td.Name = "泰迪"
    	// td.Age = 1
    	td.Eat()
    }
    

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

    type B struct {
    	Name string
    }
    
    type C struct {
    	Name string
    	A
    	B
    }
    
    func (a *A) Eat() {
    	fmt.Printf("%s正在吃饭...
    ", a.Name) // AA正在吃饭...
    }
    
    func (b *B) Eat() {
    	fmt.Printf("%s正在吃饭...
    ", b.Name) // 正在吃饭...
    }
    
    func main() {
    	var c C
    	c.Name = "CC"
    	c.A.Name = "AA"
    	c.A.Eat()
    	c.B.Eat()
    }
    

    2.3 如果一个结构体嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上这个结构体的名字。

    type A struct {
    	Name string
    }
    
    type B struct {
    	a A
    }
    
    func (a *A) Eat() {
    	fmt.Printf("%s正在吃饭...
    ", a.Name) // 佩奇正在吃饭...
    }
    
    func main() {
    	var b B
    	// b.Name = "佩奇" ,会报错,必须指定有名结构体的名字,如下
    	b.a.Name = "佩奇"
    	b.a.Eat()
    }
    

    2.4 嵌套匿名结构体后,也可以在创建结构体实例时,直接指定各个匿名结构体字段的值。

    type Goods struct {
    	Name string
    	Price float64
    }
    
    type Brand struct {
    	Name string
    	Address string
    }
    
    type TV struct {
    	*Goods
    	*Brand
    }
    
    func main() {
    	tv1 := TV{&Goods{"电视机", 99.8}, &Brand{"长虹", "四川"}}
    	tv2 := TV{
    		&Goods{
    			Name: "电视机",
    			Price: 99.8,
    		},
    		&Brand{
    			Name: "长虹",
    			Address: "四川",
    		}}
    	fmt.Println(tv1, tv2) // {0xc000004480 0xc0000044a0} {0xc0000044c0 0xc0000044e0}
    	fmt.Println(tv1.Goods, tv1.Brand) // &{电视机 99.8} &{长虹 四川}
    	fmt.Println(*tv1.Goods, *tv1.Brand) // {电视机 99.8} {长虹 四川}
    }

    2.5 结构体嵌套基本数据类型也是可以的

    type A struct {
    	int
    }
    
    func main() {
    	var a A
    	a.int = 100
    	fmt.Println(a) // {100}
    }

    四、多态

    在学习多态之前,先学习接口

    接口体现多态的两种形式:

    ①多态参数:在接口这一章中,使用了Usb接口案例,即可以接收手机实例,又可以接收相机实例,从而体现了 Usb 接口的多态;

    ②多态数组:给 Usb 数组中,存放 Phone 和 Camera 结构体的实例,Phone 还有一个特有的 Call 方法。遍历Usb数组,如果是 Phone 结构体的实例,除了调用 Usb 接口中声明的方法外,还需要调用 Call 方法。本示例在断言的最佳实践示例1中。

    五、面向对象项目体验

    https://files.cnblogs.com/files/believepd/familyaccount.zip

  • 相关阅读:
    BFS模板 + 力扣例题
    和小吴日常3
    和小吴日常2
    Cocos Creator 学习记录
    js浏览器事件循环机制
    vue+uniapp 项目中一些常用知识
    JSP第一次作业
    Test
    InnoDB存储引擎
    MySQL存储引擎
  • 原文地址:https://www.cnblogs.com/believepd/p/10940212.html
Copyright © 2011-2022 走看看