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

Go的面向对象

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

收录于:152天前

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()

在这里插入图片描述

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

. . .

相关推荐

额外说明

牛狩猎问题

Description 农民John刚刚获悉一头逃跑的牛的位置,打算立刻就去把它抓回来。John和牛都站在一条直线上,开始时John位于坐标点N上( 0 ≤ N ≤ 100,000 ),牛位于坐标点K上( 0 ≤ K ≤ 100,000 )。John有两

额外说明

BeanUtils.copyProperties 复制对象忽略空值

一、前言:开发中,需要使用BeanUtils.copyProperties进行对象拷贝,但是值为null的需要过滤,忽略拷贝,BeanUtils.copyProperties的构造方法中有一个三个参数的 传入可变长度的字符串,改字符串就是忽略的字段名 二

额外说明

leetcode31(接下来的排列:双面扫描)

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须 原地 修改,只允许使用额外常数空间。 示例 1: 输入:nums = [1,2,3]

额外说明

static和final关键字 学习 demo练习

单利模式: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供

额外说明

【Unity实战篇 】| 如何在小游戏中快速接入一个新手引导教程

前言 【Unity实战篇 】 | 如何在小游戏中快速接入一个新手引导教程 一、简单教程描述 二、接入Tutorial Master 实现游戏引导 2.1 导入Tutorial Master2插件 2.2 添加TutorialMasterManager脚本

额外说明

Linux 之 链接命令 ln

一、简介 ln 命令用于将一个文件创建链接。 链接分为软链接和硬链接,命令默认使用硬链接(即options为空时)。 软链接:类似于windows系统中的快捷方式,对链接进行操作,不会修改源文件。不可以删除源文件,删除源文件导致链接文件找不到。   硬链

额外说明

快速幂算法

-歌曲分享  溯 (Reverse)——CORSAK胡梦周、马吟吟 什么是快速幂呢?就是更快速的计算幂运算。   875. 快速幂 - AcWing题库 快速幂的作用就是跟题目中描述的一样  先预处理出这些值 比如   求k的个位 k&1 删除k的个位 

额外说明

C++ 继承遇到同名成员变量和成员函数研究

#include <iostream> using namespace std; /* * 继承遇到重名成员: * 1,派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽了基类的同名成员 * 2,在派生类使用基类的同名成员,显示地使用类名限定符

额外说明

实施Microsoft Dynamics 365 CE-6. 自定义Dynamics365CE介绍了自定义Dynamics365CE应用程序的方法

本章将帮助您了解Dynamics 365自定义功能。您将了解自定义的概念,以及如何考虑重用现有组件而不是创建新实体。您将学习如何创建新实体以及自定义实体窗体、视图和数据类型。您还将了解Dynamics365客户参与(CE)安全性。稍后,您将了解如何自定义

ads via 小工具