首页 > 其他分享 >go语言的"面向对象"

go语言的"面向对象"

时间:2023-07-05 20:23:46浏览次数:27  
标签:run 语言 Cat 面向对象 Animal go Go func name

面向对象定义

面向对象三要素:

  • 封装:将属性(数据)和方法(操作)封装,提供访问控制,隐藏实现细节,暴露该暴露的
  • 继承:子类可以从父类直接获得属性和方法,减少重复定义。子类中如果与父类不同,可以自己定 义新的属性和方法,也可以覆盖同名的属性和方法
  • 多态:前提是继承和覆盖,使得子类中虽然使用同一个方法,但是不同子类表现不同,就是不同的态

实现了以上特征的语言,才能成为面向对象编程范式语言。 严格意义来说,Go语言就是不想实现面向对象编程范式。但是面向对象又有一些不错的特性,Go语言 通过组合的方式实现了类似的功能。 只能说,Go语言实现了一种非常有自我特征的面向对象。

封装

通过结构体,可以把数据字段封装在内,还可以为结构体提供方法。

访问控制:

  • 属性、方法标识符首字母大写,实现了对包外可见的访问控制
  • 属性、方法标识符首字母小写,仅包内可见
  • 这些一定程度上实现了public、private的访问控制

构造函数

Go没有提供类似C++、Java一样的构造函数、析构函数。在Go中,用构造结构体实例的函数,这个函数 没有特别的要求,只要返回结构体实例或其指针即可(建议返回指针,不然返回值会拷贝)。习惯上, 构造函数命名是New或new开头。如果有多个构造函数,可以使用不同命名函数,因为Go也没有函数重载。通过不同的函数名来模拟构造函数重载。

type Animal struct {
 name string
 age  int
}
func NewDefaultAnimal() *Animal {
 return &Animal{"nobody", 1}
}
func NewAnimal(name string, age int) *Animal {
 return &Animal{name, age}
}

继承

Go语言没有提供继承的语法,实际上需要通过匿名结构体嵌入(组合)来实现类似效果。

package main
import "fmt"
type Animal struct {
 name string
 age  int
}
func (*Animal) run() {
 fmt.Println("Animal run~~~")
}
type Cat struct {
 Animal // 匿名结构体嵌入
 color  string
}
func main() {
 cat := new(Cat)
 cat.run()
    cat.Animal.run()
}

通过匿名结构体嵌入,子结构体就拥有了父结构体的属性name、age,和run方法。

覆盖

覆盖override,也称重写。不是重载overload。

// 为Cat增加一个run方法,这就是覆盖。
func (*Cat) run() {
 fmt.Println("Cat run+++")
}

上例增加run方法是完全覆盖,就是不依赖父结构体方法,重写功能。 如果是依赖父结构体方法,那就要在子结构体方法中显式调用它。

func (c *Cat) run() {
 c.run()        // 这里不可这样写,成递归了
 c.Animal.run() // 这是调用父结构体方法。
 fmt.Println("Cat run+++")
}

多态

Go语言不能像Java语言一样使用多态,但可以通过引入interface接口来解决。

package main
import "fmt"
type Runner interface {
 run()
}
type Animal struct {
 name string
 age  int
}
func (*Animal) run() {
 fmt.Println("Animal run~~~")
}
type Cat struct {
 Animal // 匿名结构体嵌入
 color  string
}
func (c *Cat) run() {
 c.Animal.run()
 fmt.Println("Cat run+++")
}
type Dog struct {
 Animal // 匿名结构体嵌入
 color  string
}
func (d *Dog) run() {
 d.Animal.run()
 fmt.Println("Dog run+++")
}
func test(a Runner) { // 多态
 a.run()
}
func main() {
 // var a Animal = Cat{} // Go做不到这样赋值
 // a.run() // Go无法写出这2行,用接口
    
 d := new(Dog)
 d.name = "snoopy"
 test(d)
 c := new(Cat)
 c.name = "Garfield"
 test(c)
 test(d)
}
示例

test使用同一个类型的同一个接口却表现不同,这就是多态。

标签:run,语言,Cat,面向对象,Animal,go,Go,func,name
From: https://www.cnblogs.com/caibao666/p/17529676.html

相关文章

  • go语言结构体排序
    排序接口从接口定义来看,要实现某类型的排序要知道有多少个元素2个指定索引的元素怎么比较大小,索引i的元素小于索引j的值返回true,反之返回false如何交换指定索引上的元素那么自定义类型,要想排序,就要实现sort包中该接口。结构体排序 假设有N个学生,学生有姓名和年龄,按照年龄......
  • Visual Studio2019 BackgoroundImageLayout属性
    ​BackgroundImageLayout属性值背景图片重复:BackgroundImageLayout属性设置为Tile(默认)背景图片左边显示:BackgroundImageLayout属性设置为None背景图片右边显示:BackgroundImageLayout属性设置为None,同时RightToLeft属性设置为Yes背景图片居中显示:BackgroundImageLayout属性设......
  • 使用GoEasy快速实现Android原生app中的websocket消息推送
    摘要:GoEasy带来了一项令开发者振奋的消息:全面支持Android原生平台!现在,您可以在Android应用中使用最酷炫的实时通信功能,借助GoEasy轻松实现消息的发送和接收。本文将带您领略GoEasy最新版本的威力,为您的应用增添一抹鲜活的互动色彩。嗨,开发者朋友们!是时候展现您的技术才华,让您的A......
  • django中使用form表单或者ajax提交数据时如何验证csrftoken
    使用form表单来提交数据时,如何验证csrftokenajax提交数据时验证csrftoken在需要提交的html页面引入以下js文件就行引入csrf.js文件<scriptsrc="{%static'js/csrf.js'%}"></script>文件内容:/***根据cookie的name获取对应的值*@paramname*@returns{null}......
  • MongoDB数据库部署与应用
    MongoDB数据库部署与应用拓扑图:推荐步骤:在Centos01上安装mongoDB数据库管理mongoDB服务生成MongoDB配置文件通过控制文件控制MongoDB服务,配置MongoDB身份验证配置mongoDB身份验证管理和修改配置文件支持验证配置mongoDB基本管理配置MongoDB数据备份恢复实验步骤:一.在Centos01上安装m......
  • golang 解析yaml文件
    初始化packagemainimport( "github.com/spf13/viper")funcinitConfig(){ viper.SetConfigName("config") viper.AddConfigPath("./") iferr:=viper.ReadInConfig();err!=nil{ fmt.Println("Initsetingerror:",......
  • C语言学习笔记
    C语言学习笔记1.初识C语言常见类型长度单位:字节=比特全局变量和局部变量全局变量:定义在花括号外的变量局部变量:定义在花括号内的变量局部变量和全局变量的名字重合时,局部变量优先C语言规定变量要定义在当前代码块的最前面*计算两数之和:#include<stdio.h>intmain()......
  • Java面向对象
    Java面向对象什么是面向对象1.面向过程步骤简单清晰2.面向对象分类的思维模式适合处理复杂的问题3.oop以类的方式组织代码,以对象的组织(封装)数据4.特点:抽象5.特性:封装、继承、多台回归方法的定义和调用1.方法的定义1.return代表方法结束了......
  • 汇编语言程序设计(二)之寄存器
    系列文章汇编语言程序设计(一)寄存器在学习汇编的过程中,我们经常需要操作寄存器,那么寄存器又是什么呢?它是用来干什么的?它有什么分类?又该如何操作?…你可能会有许多的问题,答案都会在本文中进行揭晓。1寄存器的概念一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线......
  • Goland 不能识别GOROOT解决办法
    https://www.jianshu.com/p/7a2bcfa5f739 对于golang版本大于1.15,可能在配置Goland的时候会有加载不了GOROOT的情况,这个时候需要修改一个文件go/src/runtime/internal/sys/zversion.go://Codegeneratedbygotooldist;DONOTEDIT.packagesysconstStackGuardMul......