您的位置 首页 golang

Go语言基础—面向对象(继承)

继承

  • 按照传统面向对象思想,继承就是把同一类事务提出共同点为父类,让子类可以复用父类的可访问性内容。
  • 继承有多种实现方式
  • 使用java或C#的应该知道,尽量少用继承,而是使用组合代替继承,可以使用高内聚,低耦合,Java之父之前再一次采访的时候也说过,如果给他一次机会重新做java,他最希望修改的地方就是继承
  • Go语言中的继承是通过组合实现

匿名属性

  • 在Go语言中支持匿名属性(结构体中属性名字),但是每个最多只能存在匿名属性,编译器认为 类型就是属性名 ,我们在使用时就把类型当作属性名进行使用
 type People struct {
   string
   int
}

func main() {
   p := People{"theoutsider", 18} //只能在当前文件中如此调用
   fmt.Println(p.string)
}  

结构体之间的关系

  • 传统面向对象中类和类之间的关系

继承:is-a,强耦合性,一般认为类与类之间具有强关系

实现like-a,接口和实现类之间的关系

依赖:use-a,具有偶然性的,临时性的,非常弱的,但是B类的变化会影响到A,一般作为方法参数

关联:has-a一种强依赖关系,比如我和我的朋友,这种关系比依赖更强不存在依赖关系的偶然性。关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的,关联可以是单向、双向的

聚合:has-a,整体与部分,拥有的关系

组合:contains-a,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命走起结束也就意味着部分的生命周期结束

组合 > 聚合 > 关联 > 依赖

  • Go语言中标准的组合关系:
 type People struct {
   name string
   age int
}

type Teacher struct {
   peo   People
   classroom string
}

func main() {
   tea := Teacher{classroom: "403班", peo: People{name:"js", age: 18}}
   //必须通过包含的变量名调用另一个结构体中内容
   fmt.Println(tea.classroom,tea.peo.name,tea.peo.age)  //输出:403班 js 18
}  

使用匿名属性完成Go语言中的继承

  • Go语言中的继承很好实现,把一个结构体类型当作另一个结构体的属性,可以直接调用另一个结构体中的内容
  • 因为Go语言中结构体不能相互转换,所以不能把子结构体变量赋值给结构体变量
 type People struct {
   name string
   age int
}

type Teacher struct {
   People
   classroom string
}

func main() {
   tea := Teacher{People{"theoutsider", 18},"403-classroom"}
   fmt.Println(tea.classroom,tea.name,tea.age)  //输出:403-classroom theoutsider 18
}  

文章来源:智云一二三科技

文章标题:Go语言基础—面向对象(继承)

文章地址:https://www.zhihuclub.com/101501.shtml

关于作者: 智云科技

热门文章

网站地图