国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Scala講座:混入多重繼承、類型層次和集合

開發 后端
本文選自Scala講座的第四篇的內容,介紹用特征來實現混入(mix-in)式的多重繼承,用特征來方便地實現面向方面的編程,Scala的類型體系,希望大家喜歡。

本文節選自最近在日本十分流行的Scala講座系列的第四篇,由JavaEye的fineqtbull翻譯。本系列的作者牛尾剛在日本寫過不少有關Java和Ruby的書籍,相當受歡迎。

序言

上一次對比Java說明了Scala的特點和類定義的方法。這一次將更加深入一點,還是以迷你旅行的方式探險一下Scala的語法特點。

接下來介紹一下用代替Java接口的特征(Trait)來實現的混入(mix-in)多重繼承、類型層次和集合。

用特征來實現混入(mix-in)式的多重繼承

Scala里相當于Java接口的是特征(Trait)。Trait的英文意思是特質和性狀(本文稱其為特征),實際上他比接口還功能強大。與接口不同的是,它還可以定義屬性和方法的實現。Scala中特征被用于服務于單一目的功能模塊的模塊化中。通過混合這種特征(模塊)群來實現各種應用程序的功能要求,Scala也是按照這個構想來設計的。

一般情況下Scala的類只能夠繼承單一父類,但是如果是特征的話就可以繼承多個,從結果來看就是實現了多重繼承。這可以被認為是同Ruby模塊基本相同的功能。就看一下下面的例子吧。為了辨認方便,此后的特征名稱前都加上前綴字母T。特征既可以繼承類也可以繼承其他特征。

  1. class Person ; //實驗用的空類,如果使用了上一次的Person類,則下面的  
  2. //PianoplayingTeacher類就需要構造參數了  
  3. trait TTeacher extends Person {  
  4. def teach //虛方法,沒有實現  
  5. }  
  6. trait TPianoPlayer extends Person {  
  7. def playPiano = {println("I’m playing piano. ")} //實方法,已實現  
  8. }  
  9. class PianoplayingTeacher extends Person with TTeacher with TPianoPlayer {  
  10. def teach = {println("I’m teaching students. ")} //定義虛方法的實現  
  11. }  
如上所示,可以連著多個with語句來混合多個特征到一個類中。***個被繼承源用extends,第二個以后的就用with語句。正如大家所知道的,可以生成實例的是非抽象(abstract)的類。另外請注意一下從特征是不可以直接創建實例的。

那么就實際運行一下吧。

  1. scala> val t1 = new PianoplayingTeacher  
  2. t1: PianoplayingTeacher = PianoplayingTeacher@170a650 
  3. scala> t1.playPiano  
  4. I’m playing piano.  
  5. scala> t1.teach  
  6. I’m teaching students.  
實際上如下所示,可以在創建對象時才將特征各自的特點賦予對象。

  1. scala> val tanakaTaro = new Person with TTeacher with TPianoPlayer {  
  2. | def teach = {println("I'm teaching students.")} }  
  3. tanakaTaro: Person with TTeacher with TPianoPlayer = $anon$1@5bcd91 
  4. scala> tanakaTaro playPiano  
  5. I’m playing piano.  
  6. scala> tanakaTaro teach  
  7. I'm teaching students.  
用特征來方便地實現面向方面的編程

充分利用特征的功能之后,就能方便地實現現今流行的面向方面編程(AOP)了。

首先,用特征來聲明表示基本動作方法的模塊Taction。

  1. trait TAction {  
  2. def doAction  
  3. }  
接著作為被加入的方面,定義一下加入了前置處理和后置處理的特征TBeforeAfter。

  1. trait TBeforeAfter extends TAction {  
  2. abstract override def doAction {  
  3. println("/entry before-action"//doAction的前置處理  
  4. super.doAction // 調用原來的處理  
  5. println("/exit after-action"//doAction的后置處理  
  6. }  
  7. }  
通過上面的abstract override def doAction {}語句來覆蓋虛方法。具體來說這當中的super.doAction是關鍵,他調用了TAction的doAction方法。其原理是,由于doAction是虛方法,所以實際被執行的是被調用的實體類中所定義的方法。

那么將實際執行的實體類RealAction作為TAction的子類來實現吧。

  1. class RealAction extends TAction {  
  2. def doAction = { println("** real action done!! **") }  
  3. }  
接著就執行一下。

  1. scala> val act1 = new RealAction with TBeforeAfter  
  2. act1: RealAction with TBeforeAfter = $anon$1@3bce70 
  3. scala> act1.doAction  
  4. /entry before-action  
  5. ** real action done!! **  
  6. /exit after-action  
僅僅這樣還不好玩,接著為他定義一下別的方面,然后將這些方面加入到同一對象的方法中。接著定義一個將源方法執行兩遍的方面。

  1. trait TTwiceAction extends TAction {  
  2. abstract override def doAction {  
  3. for ( i <- 1 to 2 ) { // 循環執行源方法的方面  
  4. super.doAction // 調用源方法doAction  
  5. println( " ==> No." + i )  
  6. }  
  7. }  
  8. }  
下面,將TBeforeAfter和TtwiceAction混合在一起后執行一下。

  1. scala> val act2 = new RealAction with TBeforeAfter with TTwiceAction  
  2. act2: RealAction with TBeforeAfter with TTwiceAction = $anon$1@1fcbac1 
  3. scala> act2.doAction  
  4. /entry before-action  
  5. ** real action done!! **  
  6. /exit after-action  
  7. ==> No.1 
  8. /entry before-action  
  9. ** real action done!! **  
  10. /exit after-action  
  11. ==> No.2 
伴隨著原來方法的before/after動作一起各自執行了兩次。接著將混入順序顛倒后再試一下。

  1. scala> val act3 = new RealAction with TTwiceAction with TBeforeAfter  
  2. act3: RealAction with TTwiceAction with TBeforeAfter = $anon$1@6af790 
  3. scala> act3.doAction  
  4. /entry before-action  
  5. ** real action done!! **  
  6. ==> No.1 
  7. ** real action done!! **  
  8. ==> No.2 
  9. /exit after-action  

這樣執行后,原來的實現方法被循環執行了兩次,但是before/after則在循環以外整體只執行了一次。這是根據with語句定義的順序來執行的,知道了這原理之后也就沒有什么奇怪的了。Scala特性的如此混入順序是和AspectJ的方面以及Spring的interceptor相同的。

這樣不僅是before和after動作,只要更改了特征的實現就可以將各種方面動態地加入到原來的對象中去了,讀者自己也可以嘗試一下各種其他情況。

在Java中通過Decorator或Template Method模式來想盡辦法實現的功能,在Scala中只要通過特征就可以輕松到手了。從這還可以延展開來,通過在原來的方法中插入掛鉤的方法,即所謂的攔截者式面向方面的方法,就可以輕松地將各個方面通過特征來組件化了。

請讀者如果想起Scala是怎樣的強類型和靜態化語言的話,那么就能夠明白通過特征來加入新功能的特

點給他帶來了多大的靈活性。

Scala的類型體系(基本類型)

Scala中可使用的基本數據都以類的形式被定義了,所以基本類型與用戶定義類型可以認為是沒有區別的。雖然這么說,Scala還是提供了與Java的數據類型相對應的類定義群(圖 4-1)。這絕不是包裝類,在編譯后他們將被映射為Java的字節碼,所以性能上是絕對沒有問題的。

圖 4-1與Scala基本類型相對應的類群 

圖 4-1與Scala基本類型相對應的類群

如下例程序所示,對于整數對象7可以響應各種消息(方法)。既可以執行toString方法來轉換成字符串,又可以使用to這個執行Int => Range的方法。附帶說一下,7 to 20相當于7.to(20),該方法的執行結果是Range(7,8, 9, … 19, 20)。對于該范圍對象適用了foreach( (i)=>print(i) ),print _則與一個參數的匿名函數(i) => print(i)相當。

  1. scala> 7.toString  
  2. res2: java.lang.String = 7 
  3. scala> 7 to 20 foreach( print _ )  
  4. 7891011121314151617181920 

實際上,Scala在編譯器自動引入的Predef單例對象中定義了為了兼容Java基礎類型所存在的類型別名。例如boolean, char, byte, short, int, long, float, double被定義了,這些別名實際上是引用了Scala.Boolean,Scala.Char,Scala.Byte等Scala的類。可能的話,為了提高“Scala中說所有數據都是對象”這種意識,建議盡量一開始就使用Int、Boolean、Float等原來的類名。

不過,在Scala種并沒有類型轉換操作符,而是在所有類的基類Any中定義了具有同等功能的方法asInstanceOf[X]。用這方法就可以把類型轉換為X了。Any類中同時還定義了相當于instanceof操作符的isInstanceOf[X]方法。

圖 4-2Scala類層次的基本結構 

圖 4-2Scala類層次的基本結構

特別是該類層次中Iterable下的集類型在函數式編程中大顯身手。其中的可變(mutable)與非可變(immutable)兩大系列的類層次基本上呈現出鏡像關系,可以充分發揮出函數式語言功能的當然就是非可變集類型群了。

結束語

這一講以迷你旅行的形式說明了一下Scala語法的特點,函數定義和函數式編程就賣個關子放到下一講去吧。

【編輯推薦】

  1. Scala講座:面向對象和函數式的特點總結
  2. Scala講座:函數式編程處理樹結構數據
  3. Scala講座:編程的思考方法
  4. Scala講座:將函數作為***類對象來處理
  5. Scala講座:全局變量問題的解決
責任編輯:book05 來源: JavaEye博客
相關推薦

2009-12-11 10:45:00

Scala講座類型系統功能

2009-12-11 10:42:00

Scala講座類定義構造函數

2009-09-24 09:41:00

Scala講座Scala

2009-09-27 15:29:00

Scala講座面向對象Scala

2009-12-11 10:44:00

Scala講座函數 scala

2014-03-28 11:08:16

Java 8多重繼承

2009-09-24 09:28:00

Scala講座全局變量scala

2009-09-27 15:23:00

Scala講座函數式編程Scala

2009-09-09 11:28:40

Scala類

2009-07-22 09:02:45

Scala組合繼承

2009-11-24 17:01:39

PHP5多重繼承

2010-02-01 18:20:17

Python 多重繼承

2009-08-05 11:16:26

ASP.NET配置文件

2009-10-19 08:55:22

VB.NET多重繼承

2009-12-11 10:43:00

Scala講座操作符函數

2009-07-22 09:53:57

Scala底層類型

2009-09-24 09:38:00

Scala講座第一類對象scala

2010-01-05 13:54:24

交換機VLAN劃分方法

2024-01-29 00:31:09

void指針C++

2023-03-07 21:43:29

Java多重繼承
點贊
收藏

51CTO技術棧公眾號

成人福利在线观看| 91精品国产91久久久久福利| 免费h精品视频在线播放| 国产伦精品一区二区三区视频免费| www成人免费视频| 台湾佬中文娱乐久久久| 性做久久久久久久久| 亚洲v日韩v综合v精品v| 96sao精品免费视频观看| 欧美一区二区三区成人| 三级视频网站在线| 一区二区三区视频在线观看| 亚洲一区二区在线看| 成人vr资源| 国产一级免费在线观看| 成人午夜激情片| 欧美xxxx做受欧美| 高清亚洲高清| 在线视频一区二区| 干日本少妇视频| 国产精品tv| 欧美第一黄色网| 综合成人在线| 97国产精品人人爽人人做| 色综合888| 欧美日韩一卡二卡| 第一页在线观看| 欧美色中文字幕| 日韩欧美亚洲| 激情丁香综合五月| 欧美久久久久久久久久久久久久| 激情久久99| 欧美国产欧美亚洲国产日韩mv天天看完整| sm在线观看| 欧美精品一级二级| 永久www成人看片| 91在线观看高清| 德国一级在线视频| 亚洲免费在线观看视频| 成人在线国产精品| 亚洲午夜一区| 中国一级大黄大黄大色毛片| 麻豆极品一区二区三区| 欧美 丝袜 自拍 制服 另类| 欧美区亚洲区| 成人手机在线视频| 韩国三级日本三级少妇99| 欧美日韩黑人| 91精品视频在线看| 国产探花在线精品| 国产精品乱码一区二区三区| 日韩欧美黄色| 久久久免费观看| 88xx成人网| 久久一区二区视频| 麻豆av一区二区三区| 中文字幕在线不卡一区二区三区| 久草在线在线视频| 欧美色视频日本高清在线观看| 欧美人与牲禽动交com| 欧美一级在线亚洲天堂| 艳女tv在线观看国产一区| 亚洲一区二区三区涩| 亚洲天堂福利av| 欧美成ee人免费视频| 国内精品第一页| av理论在线观看| 91日韩在线播放| 成人av在线网站| www.av中文字幕| 1区2区3区精品视频| 情趣网站视频在线观看| 色综合久久久久网| 精品无人区一区二区| 国产精品国三级国产av| 亚洲精品久久视频| 国产啊啊啊视频在线观看| 国产精品三级久久久久久电影| 中文在线日韩| 欧洲成人av| 国产精品露出视频| 国产欧美视频在线观看| 韩国中文字幕2020精品| 欧美日韩一区二区欧美激情| 精品国产三区在线| 日本在线xxx| 亚洲视频在线观看网站| 99精品国产99久久久久久白柏| 黄色精品视频| 久久国产精品视频在线观看| 中文字幕欧美日韩va免费视频| 国产一区亚洲一区| 国产精品久久久久久久久婷婷| 日本不卡二三区| 国产真人做爰毛片视频直播| 中文字幕日韩在线播放| 国产精品国产三级国产普通话蜜臀 | 一区二区三区丝袜| 欧美日韩水蜜桃| 色偷偷亚洲第一成人综合网址| 91精品国产色综合久久不卡98| 久久综合九色综合97婷婷女人| 日韩在线亚洲| 韩国中文免费在线视频| 久久久人成影片一区二区三区观看| 久久久久久9999| 日韩美女精品| 都市激情在线视频| 亚洲一区二区三区精品视频| 欧美激情在线一区| 亚洲一区在线视频观看| 99在线热播精品免费99热| 三妻四妾的电影电视剧在线观看| 亚洲美女自拍偷拍| 国产精欧美一区二区三区| 在线中文字幕一区| 午夜日韩在线| 欧美特大特白屁股xxxx| 丰满少妇又爽又紧又丰满69| 97不卡在线视频| 93久久精品日日躁夜夜躁欧美| se01亚洲视频| 欧美一区二区三区| 亚洲精品一区二区三区樱花| 国产在线拍偷自揄拍精品| 久久亚洲影音av资源网 | 成人av一区| 四虎av网址| 男女超爽视频免费播放| 91精品国产自产在线观看永久| 亚洲综合一区在线| 99久久久久久99| 国产原创一区二区| 99视频+国产日韩欧美| 缴情综合网五月天| 久久久亚洲午夜电影| 久久亚洲二区| 亚洲精品在线观看91| 欧洲激情视频| 精品自拍偷拍| 亚洲一区二区三区精品中文字幕| 久久久久久九九九九| 高清av免费一区中文字幕| 日本一区二区在线播放| 欧美—级a级欧美特级ar全黄| 亚洲欧美日韩精品久久亚洲区| 欧美日韩一级大片网址| 91麻豆精品91久久久久久清纯| 欧美怡红院视频| 国产精品家庭影院| 国产精品视频第一区| 亚洲视频狠狠干| 国产乱码字幕精品高清av| 国产三区在线观看| 日本黄大片一区二区三区| 国产视频九色蝌蚪| 一级片视频免费观看| a√免费观看在线网址www| 中文字幕在线中文字幕二区| 国产精品一区电影| 欧美日韩国产综合视频在线观看 | 久久国产色av免费观看| www.爱色av.com| 国产成人艳妇aa视频在线| 国产91在线亚洲| 视频一区不卡| 成人三级在线| 水蜜桃亚洲精品| 成人免费观看cn| 中文字幕剧情在线观看一区| 可以看毛片的网址| 性chinese极品按摩| 青青视频在线观| av中文资源在线资源免费观看| 欧美综合影院| 欧美日韩电影在线观看| 久久久精品999| 天天在线视频色| 欧美精品videos| 精品美女永久免费视频| 人人鲁人人莫人人爱精品| 免费观看国产视频在线| 国产精品影片在线观看| 精品1区2区在线观看| 久久久久久夜| 国产鲁鲁视频在线观看免费| 欧美日韩亚洲自拍| 宅男在线精品国产免费观看| 国产一区二区丝袜| 免费无码国产v片在线观看| 草草久久久无码国产专区| 伊人色综合久久天天五月婷| 妞干网在线观看视频| 无码免费一区二区三区免费播放| 欧洲av无码放荡人妇网站| 给我免费播放片在线观看| 国产婷婷一区二区三区| 亚洲一区尤物| 青青草视频在线免费播放| 日本成人在线免费视频|