[Go 教程系列笔记]多态-Go中的OOP

貂蝉
• 阅读 1568

Go 中的多态性是在接口的帮助下实现的。正如我们已经讨论过的,接口可以在Go 中隐式实现。如果类型定义了接口中声明的所有方法,则类型实现接口。让我们看看在接口的帮助下如何在Go中实现多态性。

使用接口的多态性

任何定义了接口所有方法的类型都被称为隐式实现该接口。

接口类型的变量可以包含实现接口的任何值。接口的这个属性用于在Go中实现多态。

让我们在计算组织净收入的程序的帮助下理解Go中的多态性。为简单起见,我们假设这个想象中的组织有两种项目的收入。固定账单,时间和材料。该组织的净收入按这些项目的收入总和计算。为了简化本教程,我们假设货币是美元,我们不会处理美分。它将使用int。(我建议阅读 https://forum.golangbridge.or... 以了解如何处理美分。)

<!-- more -->

我们首先定义一个接口Income。

type Income interface {  
    calculate() int
    source() string
}

Income上面定义的接口包含两个方法 calculate() 计算并返回来自源的收入,和source() 返回源的名称。

接下来让我们为FixedBilling项目类型定义一个结构。

type FixedBilling struct {  
    projectName string
    biddedAmount int
}

FixedBilling项目有两个字段 projectName,表示项目的名称,以及biddedAmount组织为项目出价的金额。

TimeAndMaterial结构将代表时间和材料类型的项目。

type TimeAndMaterial struct {  
    projectName string
    noOfHours  int
    hourlyRate int
}

TimeAndMaterial结构有三个字段名称projectNamenoOfHourshourlyRate

下一步是定义这些结构类型的方法,这些方法计算并返回实际收入和收入来源。

func (fb FixedBilling) calculate() int {  
    return fb.biddedAmount
}

func (fb FixedBilling) source() string {  
    return fb.projectName
}

func (tm TimeAndMaterial) calculate() int {  
    return tm.noOfHours * tm.hourlyRate
}

func (tm TimeAndMaterial) source() string {  
    return tm.projectName
}

FixedBilling项目而言,收入只是项目的投标金额。因此我们从FixedBilling类型的calculate()方法返回它。

TimeAndMaterial项目的例子里,产品的收入 noOfHourshourlyRate,从具有TimeAndMaterial 接收器类型的方法calculate() 返回此值。

我们将该项目的名称作为该source()方法的收入来源返回。

由于两者FixedBillingTimeAndMaterial结构都提供了接口calculate()和source()方法的定义Income,因此两个结构都实现了Income接口。

让我们声明calculateNetIncome将计算和打印总收入的函数。

 func calculateNetIncome(ic []Income) {  
    var netincome int = 0
    for _, income := range ic {
        fmt.Printf("Income From %s = $%d\n", income.source(), income.calculate())
        netincome += income.calculate()
    }
    fmt.Printf("Net income of organisation = $%d", netincome)
}

calculateNetIncome 函数接受 []Income 作为参数的接口。它通过迭代切片并在每个项目上调用方法 calculate() 来计算总收入。它还通过调用source()方法显示收入来源。根据具体类型的Income接口,不同calculate()source()方法将被调用。因此我们在calculateNetIncome函数中实现了多态性。

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
Go实现FastCgi Proxy Client 系列(四) keep
先贴几个链接前三篇Go实现FastCgiProxyClient系列(三)(https://my.oschina.net/lwl1989/blog/1813102)Go实现FastCgiProxyClient系列(二)(https://my.oschina.net/lwl1989/blog/1789583)G
Wesley13 Wesley13
3年前
go笔记(go中的方法调用)
最近接触go语言 发现和java的方法调用有些类似但又有自己的注意点go的包我理解为则是隔离的最小模块先在src目录下创建main.go文件 package为main,然后在src下创建module1目录,在module1目录下创建两个文件packageStrut.go,packageStrut2.go  package均为module1
Stella981 Stella981
3年前
Go 源码阅读之 flag 包
Go源码阅读系列是我的源码阅读笔记。因为本人的电脑上Go的版本是1.13.4,所以就选择了该版本作为学习的版本。为此我在Github上Fork了Go的源码,并创建了study1.13.4分支,来记录对于源码的个人理解或者说中文注释也行。每当阅读完一个包后都会进行一下小结,就像这篇是对flag包的总结整理。当然在整理的过程中发现Go夜读
Wesley13 Wesley13
3年前
Go 语言 2019 调查报告发布(内含 Go 语言图谱下载)
!424头图.jpg(https://ucc.alicdn.com/pic/developerecology/5bd982ab75ce45aa84ae0c5fd245d27e.jpg)<关注公众号,回复 Go 即可下载清晰知识图谱对Go语言感兴趣但又不知从何学起的同学,可以参考一下Go语言系列文章:为什么你要选择
Stella981 Stella981
3年前
Go 用 interface 模拟多态
多态是C这种语言中的概念,是指对不同的子类对象运行自己定义的方法。在Go语言中没有类的概念,但仍然可以使用structinterface来模拟实现类的功能。下面这个例子演示如何使用Go来模拟C中的多态行为。packagemainimport"fmt"//首先定义了一
Stella981 Stella981
3年前
InfluxDB学习之InfluxDB的安装和简介
系列详情请看:《InfluxDB系列教程(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.linuxdaxue.com%2Fseries%2Finfluxdbseries%2F)》:InfluxDB是一个当下比较流行的时序数据库,InfluxDB使用Go语言编写,无需外部
Wesley13 Wesley13
3年前
Java工程师之Redis实战系列教程前言&目录
系列前言Java工程师之Redis实战系列教程,同其他教程一样,均是在下学习笔记,本系列主要参考自《Redisinaction》,将书本中的有趣的例子转化为能解决特定问题的示例程序,所有的核心章节均提供示例源码在javacourseredisinaction(https://www.oschina.net/action/GoToLi
Stella981 Stella981
3年前
GoLang构造函数
\TOC\GoLang构造函数具体代码位置构造函数(https://gitee.com/chinaliuhan/lhshortvideo/blob/master/scheduler/taskrunner/runner.go)我之前的的另一个学习项目另一篇笔记Golang学习笔记(https://my.o
Wesley13 Wesley13
3年前
go笔记
创建和删除目录os.Mkdir("file",os.ModePerm)os.MkdirAll("file2/sub1/sub2",os.ModePerm)err:os.Remove("file2/sub1")//cann'tremoveiferr!nil{