小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

Go的面向对象

Go,golang,开发语言 额外说明

收录于:15天前

Go语言没有对象的概念,也没有产生对象的关键字,但是Go语言的特性可以使用原生语法来模拟面向对象的特性。

面向对象的特点是:继承,连接类的层次模型;封装,围绕流程和数据,只能通过定义的 API 访问数据;多态性,即父类中定义的属性或方法被子类修改。继承后,可以具有不同的数据类型或表现出不同的行为。

抽象

面向对象抽象就是将现实世界中的某一类事物抽取出来,并用程序代码来表达。抽象出来的东西一般称为类或接口。

/** 动物类 */

type Animals struct {
    
	name string //动物名称
	eat  string //动物食性
}
/** 动物接口 */

type AnimalsAbstractMethod interface{
    
	showColor() string   //动物颜色
	showteech() string   //动物牙齿
	showlocation() string //生活地区

}

在Go语言中,结构体是属性的集合,并且结构体只能有属性。接口是方法的集合,接口只能是抽象方法(没有方法体)。

继承

子类继承父类的属性和行为,并根据自己的需要扩展行为。

Go语言没有类的概念,也没有extend的用法。要模拟类的行为,您必须具有类的方法和属性。在Go中,结构体可以定义属性,方法可以指向结构体,接口可以定义抽象方法,因此也可以实现继承。

阶级行为

Go中的继承是结构体的嵌套,方法可以直接重写方法体。

//继承模拟

/* 结构体构造属性 */

type Animals struct {
    
	name string //动物名称
	eat  string //动物食性
}

/* 方法构造类方法 */

func (animals Animals) toString() string {
    
	return "Animals{" + animals.name + "," + animals.eat + "}"
}


/* 结构体嵌套模拟继承 */

type Herbivore struct {
    
	animals Animals   //父类嵌套在类中提供父类的属性
	teech   string
}

/* 重写方法 */

func (berbivore Herbivore) toString() string {
    
	return "Herbivore{name=" + berbivore.animals.name + ",eat=" + berbivore.animals.eat + "}"
}

/* 实例化 */

h1 := Herbivore{
    
	animals: Animals{
    
		"狗子",
		"杂食动物",
	},
	teech: "尖锐的牙齿",
}

fmt.Println(h1)
fmt.Println(h1.toString())

在这里插入图片描述

界面行为

Go 中的接口是抽象函数的集合。 Go中的prior class概念与其他语言不同,是一个新概念。使用方法重写接口的抽象方法并将其指向继承的类。

/* 动物接口 */

type animalsBehavior interface {
    
	showColor() string    //动物颜色
	showlocation() string //生活地区
}

/* 实现接口的方法并指向结构体 */
func (berbivore Herbivore) showColor() {
    
	fmt.Println("打印动物颜色")
}

func (berbivore Herbivore) showlocation() {
    
	fmt.Println("打印动物生活区域")
}

如果重写的方法指向一个结构体,则该结构体的实例可以使用重写的抽象方法。

h1 := Herbivore{
    
	animals: Animals{
    
		"狗子",
		"杂食动物",
	},
	teech: "尖锐的牙齿",
}

fmt.Println(h1)
fmt.Println(h1.toString())

//使用抽象方法
h1.showColor()
h1.showlocation()

在这里插入图片描述

封装

封装是面向对象的特性之一,也是对象和类概念的主要特性。封装就是将流程和数据包围起来,只能通过定义好的API来访问数据。

函数是 Go 语言的基本单元。在Go语言中,访问权限是通过变量首字母的大小写来控制的。因此,使用Go来实现面向对象的功能就需要借助这个特性。

Go语言的访问权限控制不像Java那么严格。首字母大写仅限制包外的访问权限,包内可以访问。

定义四个目录如下:

在这里插入图片描述
Animals是父类,Herbivore是子类,main是主类,Test是测试类。

  • 动物报告go文件的内容
package Animals

/** 动物类 */

type Animals struct {
    
	Name string //动物名称
	Eat  string //动物食性
}

//方法指向动物结构体
func (animals Animals) makeAnimals(name string, eat string) {
    
	animals.Name = name
	animals.Eat = eat
}

func (animals Animals) toString() string {
    
	return "Animals{" + animals.Name + "," + animals.Eat + "}"
}

Animals 结构属性的首字母大写,以便可以在其他目录中访问。编写了两个方法来指向该结构。方法名的第一个字母是小写的,这意味着外部包无法访问它。

将包引入到主类中并调用

package main

import (
	"fmt"
	"unit4/src/class/Animals"
	// "unit4/src/class/Herbivore"
)

func main() {
    

	var a1 = Animals.Animals{
    
		Name: "小狗",
		Eat:  "杂食动物",
	}

	fmt.Println(a1)
}

在这里插入图片描述
没有小写字母的方法,因此在外部包不能调用。

将成员包改为大写时,如下所示:

//方法指向动物结构体
func (animals Animals) MakeAnimals(name string, eat string) {
    
	animals.Name = name
	animals.Eat = eat
}

func (animals Animals) ToString() string {
    
	return "Animals{" + animals.Name + "," + animals.Eat + "}"
}

然后你可以调用该方法,

在这里插入图片描述

结构方法和属性的隐私限制是通过首字母大写来完成的。

多态

父类中定义的属性或方法被子类继承后,它们可以具有不同的数据类型或表现出不同的行为。

在上面的例子中,编写一个 Animals 包并定义一个包含以下内容的接口:

type Animals struct {
    
	Name string //动物名称
	Eat  string //动物食性
}

type animalsBehavior interface {
    
	ShowColor() string
	ShowHeight() float32
}

func (animals Animals) ShowColor() {
    
	fmt.Println("animals color")
}

func (animals Animals) ShowHeight() {
    
	fmt.Println("animals height")
}

在其继承的类中,重写父类的方法

type Herbivore struct {
    
	Animals  Animals.Animals
	Location string
}

/* 重写父类方法 */
func (animals Herbivore) ShowColor() {
    
	fmt.Println("颜色时黄色")
}

func (animals Herbivore) ShowHeight() {
    
	fmt.Println("体重30公斤")
}

生成实例并调用主类中的方法,

h1 := Herbivore.Herbivore{
    
	Animals: Animals.Animals{
    
		Name: "小狗",
		Eat:  "杂食动物",
	},
	Location: "主人家",
}
fmt.Println(h1)
h1.ShowColor()
h1.ShowHeight()



h2 := Herbivore.Herbivore{
    
	Animals: Animals.Animals{
    
		Name: "小2",
		Eat:  "杂食动物2",
	},
	Location: "主人家2",
}

fmt.Println(h2)
h2.ShowColor()
h2.ShowHeight()

在这里插入图片描述

对象的不同实例可以通过不同的实例化和方法重写表现出不同的行为。

. . .

相关推荐

额外说明

sql base nodejs py go 操作基本数据库

const mysql = require('mysql2'); const connection = mysql.createConnection({ host: 'localhost', user: 'root', pas

额外说明

C4819 文件包含当前代码页 (936) 无法表示的字符。请以Unicode格式保存文件以防止数据丢失

1. 问题 H:\Qt_Example\ex2\ex2.cpp:1: warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 (屏蔽此警告) 2.解决 在工程文件.pro里面

额外说明

基于auto.js的微信朋友圈自动点赞脚本

环境: 安卓7以上,auto.js 4.1。 CODE: // 使得程序可以一直运行,向下滚动 while(true){ dianzan(); } // 点赞当前页面的动态 function dianzan(){ // 这里是需找到可以

额外说明

Python 第九节 第六课

[toc] return 语句和常见异常处理问题 由于 return 有两种作用: 结束方法运行和返回值. 我们一般不把 return 放到异常处理结构中, 而是放到方法最后. 执行结果: 常见异常的解决     Python 中的异常都派生自 Base

额外说明

11.8-11.14【大学生Python学习】社区总结+优秀社区成员点名表扬&&CSDN定制T恤奖励~

  欢迎每一位小伙伴的加入: 社区:大学生Python学习   文章目录: 11.8-11.14的社区总结: 社区简介: 11.8-11.14的社区总结: 上周社区打卡完美结束,群内(社区右侧有群二维码~)有不少的小伙伴坚持每日学习,每日总结并在社区进行

额外说明

【FreeRtos基础入门】任务状态

文章目录 前言 一、任务状态 1.阻塞状态(Blocked) 2.暂停状态(Suspended) 3.就绪状态(Ready) 总结 前言 本freertos使用stm32系列单片机,使用其他的也可以,如esp系列等… 任务管理是实时操作系统(RTOS)的

额外说明

数据结构与算法-队列的顺序存储操作及应用C语言实现(超详细注释/设计/实验/作业)

目录 一、引言 二、目的 1. 掌握顺序队列的存储结构 2. 掌握顺序队列的基本操作 3. 掌握顺序队列的基本特性 三、环境与设备 1.操作系统:Windows 10 2.编译器:Visual Studio 2021 四、存储结构 五、函数 六、核心代码

额外说明

Redis两大持久化方式

Redis具有两种主要的持久化方式:RDB(Redis Database Backup)和AOF(Append-Only File)。 1. RDB持久化方式 1.1 RDB概述 RDB(Redis Database Backup) RDB是Redis进

额外说明

SpringBoot之异常处理

文章目录 前言 一、默认规则 二、定制异常处理处理 自定义错误页面 @ControllerAdvice+@ExceptionHandler处理全局异常 @ResponseStatus+自定义异常 自定义实现 HandlerExceptionResolve

额外说明

Python图形的绘制(圆圈的绘制)

import turtle def tuxing(): colors = ["blue","yellow","orange","green","red","indigo","purple",'black'] for i in range

ads via 小工具