golang 面向对象编程

chris-cp · · 1237 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

概述

Golang语言的面向对象与c++,py等语言有所不同,是由于Golang不支持继承;与上述支持聚合和继承的面向对象的语言不同,Golang只支持聚合(也叫做组合)和嵌入。聚合和嵌入的区别:

type ColoredPoint struct {
    color.Color     //匿名字段(嵌入)
    x, y int        //具名字段(聚合)
}
warning:(point := ColoredPoint{})
    字段访问:
        point.x , point.y, point.Color [当访问来自于其他pkg的类型字段时候,只用到了其名字的最后一部分]

在传统面向对象的编程中,“类(class)", "对象(object)", "实例(instance)"被定义了很清晰。在Golang完全没有这些术语,而是使用"类型(type)" 和 "值(value)"来取代,其中自定义类型的值可以包含方法;

由于Golang中没有继承,也就没有虚函数。Golang对此的支持采用类型安全的鸭子类型(duck type)。简单概况为:在Golang中,参数可以被声明为一个具体类型(例如int,string,或者*os.File 以及MyType),也可以是接口(interface),即提供了具有满足该接口的方法的值。

对于一个声明为接口的参数,可传入任意值,只要该值包含该接口所声明的方法。无论该值的实际类型是什么;

这点异常灵活强大,特别是与Golang所支持的访问嵌入字段的方法相结合时;

取代继承

继承的优势是,有些方法在基类中实现一次,子类中即可使用;Golang为此提供了两个解决方案:

  • 使用嵌入; 嵌入一个类型,方法值需要在所嵌入的类型中实现一次,即可在所有包含该嵌入类型的类型中使用;
  • 为每一种类型提供独立的方法; 简单地包装功能性作用的代码放进一个函数中,然后让所有类的方法都调用这个函数;

Golang Interface

Golang面向对象编程中另一个与众不同点是它的接口,值和方法都保持独立。

  • 接口用于声明方法签名
  • 结构体用于声明聚合或者嵌入的值
  • 方法用于声明在自定义类型(通常为结构体)上的操作

在自定义类型的方法和任何特殊接口之间没有显示的联系。但如果该类型的方法满足一个或多个接口,那么该类型的值可以用于任何接受该接口的值的地方。当然,每一个类型都满足空接口(interface{}), 因此任何值都可以用于声明了空接口的地方;


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:chris-cp

查看原文:golang 面向对象编程

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1237 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传