文档章节

Go 用 interface 模拟多态

兔之
 兔之
发布于 2017/07/13 20:21
字数 327
阅读 13
收藏 0

多态是 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() 方法时,调用了各自实现的逻辑。这就模拟出了多态。

© 著作权归作者所有

兔之
粉丝 69
博文 250
码字总数 96477
作品 7
深圳
程序员
私信 提问
面向接口编程详解(一)

我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作...

不最醉不龟归
2016/11/17
31
0
学习ASP.NET的第一天

1、变量的命名 首先我们要保证的就是变量的名称一定要有意义(就是我们看到了变量的名字,就知道变量在这段程序中的作用) Camel:多余用给变量或者字段命名,第一个单词的首字母小写,其余每个...

myy629464
2017/10/08
0
0
多态的静态绑定(CRTP手法)

Curiously Recurring Template Pattern (CRTP手法) 原理很简单 通过模板函数 的强制转换调用子类同名函数,来模拟多态的动态绑定,实现和虚函数一样的功能,并且避免了动态绑定所带来的性能...

梦想游戏人
2016/05/20
35
0
对Java多态的理解

Java中多态性的实现 什么是多态 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 多态的定义:指允...

wf王帆
2016/05/22
117
0
Java基础进阶 第四天 抽象接口多态

今日任务: 1,能够独立使用抽象类 2,能够独立使用多态 3,能够独立使用接口 4,能够理解适配器设计模式 1. 抽象类 1.1. 抽象类的产生 需求:创建类描述猫和狗的行为; 猫的行为:抓老鼠;吃...

Villain丶Cc
2018/06/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Google Guava 笔记

一、引言 Guava 是 google 几个java核心类库的集合,包括集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common ...

SuShine
26分钟前
7
0
SpringBoot中使用@Value为静态变量赋值并测试是否成功

今天想像普通变量一样如下采用写法取配置的,但取到的是个null。。。 @Value("${test.appKey}")private static String appKey; 才发现不能通过这种方式取配置来给static变量赋值 在网上搜索...

SilentSong
27分钟前
5
0
ECMAScript语句之with 语句

ECMAScript with 语句,用于设置代码在特定对象中的作用域(with运行缓慢,设置了属性值时更加缓慢,最好避免使用with语句) 一、with 语句用于字符串(配合toUpperCase()方法) var a = "C...

专注的阿熊
28分钟前
4
0
Apache Flink 进阶(一):Runtime 核心机制剖析

1. 综述 本文主要介绍 Flink Runtime 的作业执行的核心机制。首先介绍 Flink Runtime 的整体架构以及 Job 的基本执行流程,然后介绍在这个过程,Flink 是怎么进行资源管理、作业调度以及错误...

大涛学长
34分钟前
4
0
7. 整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假设我们的环境只能...

苏坡吴
35分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部