当前位置: 首页 > 编程日记 > 正文

scala学习手记34 - trait方法的延迟绑定

trait的方法的延迟绑定就是先混入的trait的方法会后调用。这一点从上一节的实例中也可以看出来。

下面再来看一个类似的例子:

abstract class Writer {def write(message: String): String
}trait UpperWriter extends Writer {abstract override def write(message: String): String = super.write(message.toUpperCase)
}trait FilterWriter extends Writer {abstract override def write(message: String): String = super.write(message.replace('o', '-'))
}trait StringWriter extends Writer {def write(message: String): String = message
}val myWriter1 = new StringWriter with UpperWriter with FilterWriterval myWriter2 = new StringWriter with FilterWriter with UpperWriterprintln(myWriter1 write "Hello World!")println(myWriter2 write "Hello World!")

在代码中定义了一个抽象类和三个trait。

其中抽象类Writer仅定义了一个抽象方法,并没有提供具体的实现。因此继承抽象类Writer的trait必须要实现write方法。

UpperWriter的write方法实现了将传入的英文字符转为大写;

FilterWriter的write方法实现了将小写的“o”替换为“-”;

StringWriter则只是将传入的字符串原样返回。

看一下上面的代码的执行结果:

image

验证了我们的说法:延迟绑定就是先混入的trait会后执行。

myWriter1的执行顺序:FilterWriter –> UpperWriter –> StringWriter;

myWriter2的执行顺序:UpperWriter –> FilterWriter –> StringWriter。

从trait的延迟绑定很容易会想到java的父类与子类的初始化顺序。又或者是java中的责任链模式。因此想想用java来实现这一点并不难:可以采用不同顺序的责任链,也可以是使用不同的继承顺序来实现。

再者,从这两节可以看出来scala中的trait和抽象类并无多大差别:

  1. 都可以有普通方法和抽象方法;
  2. 都可以有普通成员变量和抽象变量;
  3. 抽象类能做的事情trait都能做。

那他们的差别在哪儿呢:

  • trait可以多重混入,抽象类只能单继承;
  • 抽象类可以定义构造函数;
  • trait可以混入实例,抽象类不可以。

那什么时候用trait,什么时候用抽象类呢:

  • 优先使用trait。一个类扩展多个trait是很方便的,但却只能扩展一个抽象类。
  • 如果你需要构造函数参数,使用抽象类。因为抽象类可以定义带参数的构造函数,而trait不行。例如,你不能说trait t(i: Int) {},参数i是非法的。

参考文档:

https://twitter.github.io/scala_school/zh_cn/basics.html

http://stackoverflow.com/questions/1991042/what-is-the-advantage-of-using-abstract-classes-instead-of-traits

http://www.artima.com/pins1ed/traits.html#12.7

##############

转载于:https://www.cnblogs.com/amunote/p/5774667.html

相关文章:

(原創) Altera Technology Roadshow 2011 Taipei (SOC) (Quartus II) (Nios II) (Qsys)

Abstract這是我第一次參加Altera一年一度的Technology Roadshow。 Introduction 今年的Altera Technology Roadshow是在台北喜來登大飯店舉行。 位置在喜來登飯店的B2。 講師的講台。 當天的會場布置。 當天的演講內容,主要是台灣Altera兩家代理商Galaxy與Arrow的FA…

git-flow工作流说明

本文以一虚拟项目为例,描述了Git Flow在项目中的应用;还以此为主线,以表格形式给出了速查手册;最后,结合这两点介绍了一个基于Git Flow的项目实例。 希望这篇文章能够帮助Git初学者尽快上手。 1.1 什么是Git Fl…

2015湖南省省赛 阶乘除法 暴力

阶乘除法Time Limit:5000MS Memory Limit:65535KB 64bit IO Format: NBUT 1643Description 输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n! 1*2*3*...*n (n>1)。 比如,若 n6, m3,则 n!/m!6!/3!720/6120。 是不是很简单?现在让我们把问题反过来:输入 kn!/m!,找到…

【ACM】POJ 1664

现在还不能理解为什么 至少有一个盘子用f(m,n-1)表示就可以了 AC: #include <iostream> #include <cstdio> using namespace std; int f(int m,int n) {if(m1 || n1 || m0) return 1;else if(m<n) return f(m,m);else{return f(m-n,n)f(m,n-1);} } int mai…

高效程序员的 7 个共同特征

导读&#xff1a;要想成为一个伟大的程序员&#xff0c;需要的可不仅仅是能够编写出可以正常运行的代码。Justin James给出了能够成为业内顶尖高手的程序员应该具有的几个典型特质。 要想成为高效的程序员&#xff0c;你需要具备一定的综合素质才能够让你用你所掌握的技能、经验…

Openstack组件实现原理 — Keystone认证功能

前言Keystone实现始终围绕着Keystone所实现的功能来展开&#xff0c;所以在理解其实现之前&#xff0c;建议大家尝试通过安装Keystone这一个过程来感受Keystone在Openstack架构中所充当的角色。下面给出了Keystone-M的安装过程。Keystone安装列表Openstack组件部署 — Overview…

unity test相关

http://www.throwtheswitch.org/unity

【小贴士】在线画流程图工具

https://c.runoob.com/more/shapefly-diagram/

Unity3D笔记 GUI 一

要实现的功能&#xff1a; 1、个性化Windows界面  2、减少个性化的背景图片尺寸  3、个性化样式ExitButton和TabButton  4、实现三个选项卡窗口 一、个性化Windows界面 1.1、创建一个空的GameObject、在Project中新建GUI Skin 用于绘制Windows图片 1.2 GUI Skin设置 1.3效…

gdb相关(栈和寄存器)

GDB的常用调试命令大家可以查阅gdb手册就可以快速的上手了&#xff0c;在这儿就不给大家分享了&#xff0c;需要的可以到GDB的官网去下载手册。这里重点分享下GDB调试中的一些寄存器和栈的相关知识用于解决下列gdb调试时的问题&#xff1a; 优化的代码在printf或其它glibc函数…

bzoj1688[Usaco2005 Open]Disease Manangement 疾病管理*

bzoj1688[Usaco2005 Open]Disease Manangement 疾病管理 题意&#xff1a; n头牛&#xff0c;d种疾病&#xff0c;每头牛都患一些疾病&#xff0c;现在要求选出最多的牛&#xff0c;使这些牛患病的种类数不超过k。n≤1000&#xff0c;d≤15 题解&#xff1a; 状压dp。f[i][S]表…

【数据结构】二叉树的应用。

1、分别采用递归和非递归的方式编写两个函数&#xff0c;求一棵给定二叉树中叶子节点的个数 2、返回一棵给定二叉树在中序遍历下的最后一个结点 3、假设二叉树采用链式方式存储&#xff0c;root为其根节点&#xff0c;p和q分别指向二叉树中任意两个结点&#xff0c;编写一个函…

我为我Windows Home Server 预热

这两天在下载Windows Home Server,所以找一些资料来看. 微软宣布Windows Home Server&#xff08;WHS&#xff09;正式推出&#xff0c;WHS是一个帮助家庭保护&#xff0c;连接并共享他们的数字媒体与文档的新解决方案。用户可以从各大在线商店进行预订&#xff0c;之后会在本月…

c 宏定义用法#define

转自&#xff1a;https://blog.csdn.net/boring_wednesday/article/details/78756696 宏定义 语法 #define name Stuff #define PI 3.14 //定义一个M&#xff0c;值为3.14 #define DO_FOREVER for(;;) //定义一个死循环 #define REG register //定义REG来作为register的别…

Linux学习笔记—— 权限及权限管理

权限及权限管理权限管理&#xff1a;r&#xff1a;w&#xff1a;x&#xff1a;三类用户&#xff1a;u&#xff1a;属主g&#xff1a;属组o&#xff1a;其他用户chown&#xff1a;改变文件属主&#xff08;只有管理员可以使用此命令&#xff09;# chown USERNAME file,...-R&…

【ACM】签到题

#include <stdio.h> int main () {int T,a,b,c,x,ji,ya,e;scanf("%d",&T);while(T--){scanf("%d%d%d%d",&a,&b,&c,&x);ya(a*x)/(c-b);e(a*b*x)/(a*c-a*b);jiex;printf("%d %d %d\n",ji,ya,e);}return 0; }

图解eclipse+myeclipse完全绿色版制作过程

现在在Java开发中&#xff0c;使用的开发工具大部分都是Eclipse&#xff0c;并且和Eclipse关系紧密的要数MyEclipse了&#xff0c;但是 MyEclipse是一个EXE可执行程序&#xff0c;对于没有安装Eclipse与MyEclilpse的电脑来说&#xff0c;首先得先解压Eclipse&#xff0c;然后再…

linux proc/xx/maps文件分析

转载&#xff1a;https://blog.csdn.net/lijzheng/article/details/23618365 Proc/pid/maps显示进程映射了的内存区域和访问权限。对应内核中的操作集为proc_pid_maps_op&#xff0c;具体的导出函数为show_map。内核中进程的一段地址空间用一个vm_area_struct结构体表示&#…

【ACM】熊孩子的乐趣

题目链接&#xff1a;http://acm.nuc.edu.cn/OJ/contest/show/43/1000 【问题描述】 Alice跟Bob是学校里出了名的两个熊孩子&#xff0c;会在任何事情上争个高低&#xff0c;彼此都不服输。幼儿园的老师每次分糖果的时候看到这两个熊孩子也很头疼&#xff0c;两个人都想占便宜…

mysql insertOrUpdate 方法

为什么80%的码农都做不了架构师&#xff1f;>>> 自己对这个方法又有点小心得 分享下 https://my.oschina.net/hccake/blog/777225 mysql "ON DUPLICATE KEY UPDATE" 语法 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE&#xff0c;并且插入行后会导…

软件破解工具整理收集

1.调试工具softice 2.调试工具Trw2000 3.反汇编工具Wdasm8.93 4.Hiew 5.Visual Basic程序调试工具Smartcheck 6.十六进制编辑器&#xff08;如&#xff1a;Ultraedit、WinHex、Hex Workshop 等&#xff09; 7.注册表监视工具RegShot、regmon或RegSnap 8.侦测文件类型工具…

Linux 下 UltraEdit 版本: 16.1.0.18 破解 30 天试用限制

rm -rfd ~/.idm/uex rm -rf ~/.idm/*.spl rm -rf /tmp/*.spl

【ACM】杭电OJ 2149

Public Sale 【问题描述】 虽然不想&#xff0c;但是现实总归是现实&#xff0c;Lele始终没有逃过退学的命运&#xff0c;因为他没有拿到奖学金。现在等待他的&#xff0c;就是像FarmJohn一样的农田生涯。 要种田得有田才行&#xff0c;Lele听说街上正在举行一场别开生面的拍…

PV UV IP

UV &#xff08;网站独立访客&#xff09; 编辑UV是unique visitor的简写&#xff0c;是指通过互联网访问、浏览这个网页的自然人。独立IP&#xff1a;是指独立用户/独立访客。指访问某个站点或点击某条新闻的不同IP地址的人数&#xff0c;在同一天的00:00-24:00内&#xff0c;…

VBA中级班课时3小结

本课内容&#xff1a;工作簿和工作表对象 主讲&#xff1a;rover18 学习时间&#xff1a;2010年11月 本节课将学习工作簿对象Workbooks、Workbook与工作表对象Worksheets、Worksheet。在我们了解了VBA的四大要素——对象、属性、方法和事件后&#xff0c;会发现VBA的程序是对对…

解决firefox ubuntu无法打开页面的问题

firefox备份用户配置信息 https://support.mozilla.org/zh-CN/kb/%E5%A4%87%E4%BB%BD%E4%BD%A0%E7%9A%84%E4%BF%A1%E6%81%AF 把xxxxxxxx.default 覆盖掉xxxxxxxx.default-release里面的内容

js构造函数式编程

1.函数式编程 //创建和初始化地图函数&#xff1a;function initMap(){createMap();//创建地图setMapEvent();//设置地图事件addMapControl();//向地图添加控件}//创建地图函数&#xff1a;function createMap(){var map new BMap.Map("dituContent");//在百度地图容…

【ACM】绝地求生

题目链接&#xff1a;http://acm.nuc.edu.cn/OJ/contest/show/43/1009 【问题描述】 zbt最近喜欢上了《绝地求生》&#xff08;pubg&#xff09;游戏&#xff0c;pubg这个游戏有一种跑毒机制&#xff0c;每次会产生一个圆形的安全区,玩家需要从他的当前位置在一定时间内进入安…

【oracle】dblink创建

目的&#xff1a;oracle中跨数据库查询 两台数据库服务器db_A(本地)和db_B(远程192.168.1.100)&#xff0c;db_A下用户user_a 需要访问到db_B下user_b的数据解决&#xff1a;查询得知使用dblink(即database link 数据库链)实现过程&#xff1a;1、确定用户user_a有没有创建 db…

ASan(Linux),gcc4.8以上版本自带的内存检查工具

转自&#xff1a;http://shafeng.github.io/2017/05/10/asan/ 最近线上的程序总是莫名其妙崩溃,因为我们的项目使用了分布负载的机制,对于玩家的影响其实很小,但是我肯定是忍不了的…程序崩溃的core文件里面完全找不到问题所在,初步分析应该是野指针导致,仔细分析程序之后并没有…