Go 用 interface 模拟多态

Stella981
• 阅读 773

多态是 C++ 这种语言中的概念,是指对不同的子类对象运行自己定义的方法。在 Go 语言中没有类的概念,但仍然可以使用 struct + interface 来模拟实现类的功能。下面这个例子演示如何使用 Go 来模拟 C++ 中的多态行为。

package main 

import "fmt"

// 首先定义了一个 Shaper 接口,它有一个 Area() 方法
type Shaper interface {
    Area() float32
}

// 定义 Square 结构体
type Square struct {
    side float32
}

// 定义一个方法,方法的接受者是 Square* 的对象。
// 可以看作是 Square 的一个成员函数,而这个方法又是实现 Shaper 接口的。
// 类似于  C++ 中继承并实现 Shaper。
func (sq *Square) Area() float32 {
    return sq.side * sq.side
}

// 定义 Rectangel 结构体
type Rectangle struct {
    length, width float32
}

// 定义一个方法,方法的接受者是 Rectangle 的对象。
// 可以看作是 Rectangle 的一个成员函数,而这个方法又是实现 Shaper 接口的。
// 类似于  C++ 中继承并实现 Shaper。
func (r Rectangle) Area() float32 {
    return r.length * r.width
}

func main() {
    rect := Rectangle{5, 3}
    squa := &Square{5}

    shapes := []Shaper{rect, squa}
    fmt.Println("Looping through shapes for area...")

    for n, _:= range shapes {
        fmt.Println("Shape details: ", shapes[n])
        fmt.Println("Area of this shape is: ", shapes[n].Area())
    }
}

最后 shapers 调用 Area() 方法时,调用了各自实现的逻辑。这就模拟出了多态。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java面试(1)
1.面向对象的基本特征  封装、继承、多态、  封装:把客观事物封装成类  继承:继承一个类,就可以使用这个类的所有功能,并且在无需编写原来类的情况下对这些功能进行扩展  多态:子对象调用父对象,父对象会根据当前调用的子对象以不同的方式运作  实现多态:覆盖,重载2.final\\finally\\finalize的区别  fin
Wesley13 Wesley13
2年前
java中多态的实现机制
多态的概念:  简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象。程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法。多态存在的前提:1、存在继承关系,子类继承父类;2、子类重写父类的方法;3、父类引用指向子类对象。具体实例:1、定义一个父类:Animal
小万哥 小万哥
11个月前
C++虚函数详解:多态性实现原理及其在面向对象编程中的应用
在面向对象的编程中,多态性是一个非常重要的概念。多态性意味着在不同的上下文中使用同一对象时,可以产生不同的行为。C是一种面向对象的编程语言,在C中,虚函数是实现多态性的关键什么是虚函数虚函数是一个在基类中声明的函数,它可以被子类重写并提供不同的实现
Wesley13 Wesley13
2年前
C++课程第五次博客——多态
\TOC\多态性Part1多态性概述多态是指同样的消息被不同类型的对象接收时导致不同的行为。在C中,所谓信息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。1)多态的类型分为四类:重载多态,强制多态,包含多态和参数多态。前两者为专用多态,而后者称为通用多态。2)
Wesley13 Wesley13
2年前
Go语言中通过结构体匿名字段实现方法的继承和重载
Go语言中的结构体可以定义匿名字段。Go语言中没有对象,但是结构体却有大量对象的功能。并且用匿名字段的确可以实现对象的继承和重载。packagemain import "fmt"  typeA struct{     x int }  typeA1 struct{
Wesley13 Wesley13
2年前
C++多态性总结
一,C多态性概述多态是指同样的消息被不同类型的对象接受时导致不同的行为。所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就调用不同的函数。换言之,多态指的就是用同样的接口访问功能不同的函数,从而实现“一个接口,多种方法”。二,多态性分类!在这里插入图片描述(https://osc
Wesley13 Wesley13
2年前
C++多态性与虚函数
  派生一个类的原因并非总是为了继承或是添加新的成员,有时是为了重新定义基类的成员,使得基类成员“获得新生”。面向对象的程序设计真正的力量不仅仅是继承,而且还在于允许派生类对象像基类对象一样处理,其核心机制就是多态和动态联编。(一)多态性  多态是指同样的消息被不同的对象接收时导致不同的行为。所谓消息是指对类成员函数的调用,不同的行为是指的不同的实现
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这