Elixir: 多太(Polymorphism)
概述
多态(
Polymorphism
)按字面的意思就是"多种状态"
. 在面向对象语言中, 接口的多种不同的实现方式
即为多态. 多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术, 赋值之后, 父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作. 简单的说, 就是一句话: 允许将子类类型的指针赋值给父类类型的指针. 多态性在Object Pascal和C++中都是通过虚函数实现的.
多太是单一接口接受不同类型的技术. 根本上, 它允许不同的数据类型适用于相同的函数. 不同类型的
相同函数形态完成相同的行为
. Elixir 适用协议(Protocols
)实现多太.
下面以一个温度的不同表示形式来说明如何在开发过程中使用多太.
# 开尔文
defmodule Kelvin dodefstruct name: "Kelvin", symbol: "K", degree: 0
end
# 华氏温度
defmodule Fahrenheit dodefstruct name: "Fahrenheit", symbol: "°F", degree: 0
end
# 摄氏温度
defmodule Celsius dodefstruct name: "Celsius", symbol: "°C", degree: 0
end
# 温度协议(接口, 只有函数定义, 没有函数实现)
defprotocol Temperature do@doc """Convert Kelvin and Fahrenheit to Celsius degree"""def to_celsius(degree)
end# 开尔文, 实现了Temperature 协议(接口)
defimpl Temperature, for: Kelvin do@doc """Deduct 273.15"""def to_celsius(kelvin) docelsius_degree = kelvin.degree - 273.15%Celsius{degree: celsius_degree}end
end
# 华氏摄氏度实现
defimpl Temperature, for: Fahrenheit do@doc """Deduct 32, then multiply by 5, then divide by 9"""def to_celsius(fahrenheit) docelsius_degree = (fahrenheit.degree - 32) * 5 / 9%Celsius{degree: celsius_degree}end
end
下面是实际的运行结果
iex> fahrenheit = %Fahrenheit{degree: 45}
%Fahrenheit{degree: 45, name: "Fahrenheit", symbol: "°F"}
iex> celsius = Temperature.to_celsius(fahrenheit)
%Celsius{degree: 7.22, name: "Celsius", symbol: "°C"}
iex> kelvin = %Kelvin{degree: 300}
%Kelvin{degree: 300, name: "Kelvin", symbol: "K"}
iex> celsius = Temperature.to_celsius(kelvin)
%Celsius{degree: 26.85, name: "Celsius", symbol: "°C"}
上面的代码, 并没有实现摄氏温度模块. 你可以试着自己实现.
iex> Temperature.to_celsius(%{degree: 12})
** (Protocol.UndefinedError) protocol Temperature not implemented for %{degree: 12}iex:11: Temperature.impl_for!/1iex:15: Temperature.to_celsius/1
如果想深入了解Elixir的多态, 可以参考Elixir内置模块 String.Char 和 Enum 的实现.
通过阅读 Enum 模块的源码, 你可以了解到, Enum 模块是如何处理不同的数据类型的.
结论
多态本质上是一种运行时动态技术, 可以想象一下变量的概念, 如果编程语言中没有变量(多态, 接口), 只有常量(具体实现类), 那编程会是一种什么样的体验?
Elixir: 多太(Polymorphism)相关推荐
- 《Two Dozen Short Lessons in Haskell》学习(八)- Function Types, Classes, and Polymorphism
<Two Dozen Short Lessons in Haskell>(Copyright © 1995, 1996, 1997 by Rex Page,有人翻译为Haskell二十四学 ...
- 《Elixir in Action》书评及作者问答录
<Elixir in Action>是由Manning所出版的一本新书,本书为读者介绍了Elixir这门语言以及Erlang虚拟机,同时也讨论了与并发编程.容错以及与高可用性相关的话题.I ...
- JavaScript、PHP、Golang、Haskell、Elixir,哪个才是最佳编程语言?
[CSDN 编者按]哪个语言是你心中的最佳编程语言呢? 作者 | Michele Riva 译者 | 弯月 责编 | 欧阳姝黎 出品 | CSDN(ID:CSDNnews) 以下为译文: 在过去 ...
- 神奇的仙丹,性感的Elixir
 在IT世界里,没有银弹,但却有神奇的仙丹(Elixir).我不知道是什么灵感刺激这门语言的创造者José Valim想到了这么酷的命名,但这枚仙丹确实经由多种神奇的灵药炼制而成,这些灵药包括Erl ...
- 按着Phoenix Framework文档练个手,感受一下Elixir语言。
介绍 Phoenix 是一个用 Elixir 编写的 Web 开发框架,它实现了服务器端模型视图控制器 (MVC) 模式.它的许多组件和概念对于我们这些具有其他 Web 框架(如 Ruby on Ra ...
- 部署Elixir项目
部署Elixir项目,确定其环境配置完成以后. 部署步骤: 数据库连接文件可以移植出项目代码中,保证项目根据安全性. 方法1: 例如,在"/var/config.prod.exs" ...
- Elixir元编程基础知识
元编程是一种功能强大但非常复杂的技术,这意味着程序可以在运行时对其进行分析甚至进行自我修改. 许多现代语言都支持此功能,Elixir也不例外. 通过元编程,您可以创建新的复杂宏,动态定义和延迟代码执行 ...
- Elixir - Map
Maps maps 是elixir中的一个基础的数据结构,存储格式为key-value(键-值)对,语法为 %{} map的两个特点: Maps 允许任何值做 key Maps 的 key 不能排序 ...
- 面向对象三大特性一一多态(polymorphism)
1 package com.bjsxt.oop.polymorphism; 2 3 public class Animal { 4 public void voice(){ 5 System.out. ...
最新文章
- html5诗歌变换颜色,关于颜色的现代诗歌
- 前端的一些常用DOM和事件归纳
- 事件标志组的等待与通知
- redis mysql原理_MYSQL MONGODB REDIS 同步原理以及高可用性对比
- 描述一下JVM加载class文件的原理机制
- vscode输入vue自动_使用vscode,新建.vue文件,tab自动生成vue代码模板
- qt tableview修改表格内容_如何修改一次代码就可以完成多种类型 cell 的 UITableView 增删修改
- 计算机专业英语词汇1690个单词
- appium环境搭建全套
- js获取当前卫星云图url并播放
- 符号链接symlink_Linux中的Symlink教程–如何创建和删除符号链接
- html文档绝对引用,excel中的绝对引用怎么用 excel中引用绝对引用是哪个键
- 10bit视频是什么?
- 微信平台开发获取微信用户的OPENID
- DirectX11 With Windows SDK--28 计算着色器:波浪(水波)
- 元学习笔记——MAML
- 利用全长转录组多重阵列测序检测同源异构体
- html设置文本颜色三种写法,html字体颜色设置方法
- 未来交通已经“上线” 高德地图智慧交通合作已攻150城,半年大增约五成
- 统计推断——假设检验——方差分析
热门文章
- 「模型解读」从“局部连接”回到“全连接”的神经网络
- “神经网络”的逆袭:80年AI斗争史
- 清华 NLP 团队推荐:必读的77篇机器阅读理解论文
- 联结你与万物的8种元素
- 制胜人工智能时代——企业人工智能应用现状分析(第三版)
- 人类与AI结合的最佳形态是什么样?|A16Z内部万字报告
- 贝叶斯网络之父Judea Pearl:要建立真正的人工智能,少不了因果推理
- Yoshua Bengio团队通过在网络「隐藏空间」中使用降噪器以提高深度神经网络的「鲁棒性」...
- 2017年深度学习重大研究进展全解读
- 程序员头发失踪之谜 | 每日趣闻