成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Scala:重載方法和字段及定義參數(shù)化字段

開發(fā) 后端
本文節(jié)選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第十章。Scala是一種針對 JVM 將函數(shù)和面向?qū)ο蠹夹g(shù)組合在一起的編程語言。

重載方法和字段

統(tǒng)一訪問原則只是Scala在對待字段和方法方面比Java更統(tǒng)一的一個方面。另一個差異是Scala里,字段和方法屬于相同的命名空間。這使得字段重載無參數(shù)方法成為可能。比如說,你可以改變類ArrayElement中contents的實(shí)現(xiàn),從一個方法變?yōu)橐粋€字段,而無需修改類Element中contents的抽象方法定義,如展示在代碼10.4中的那樣:

  1. class ArrayElement(conts: Array[String]) extends Element {  
  2.  val contents: Array[String] = conts  
  3. }  

代碼 10.4 用字段重載無參數(shù)方法

51CTO編輯推薦:Scala編程語言專題

這個ArrayElement的版本里,字段contents(用val定義)完美地實(shí)現(xiàn)了類Element里的無參數(shù)方法contents(用def定義)。

另一方面,Scala里禁止在同一個類里用同樣的名稱定義字段和方法,而在Java里這樣做被允許。例如,下面的Java類能夠很好地編譯:

  1. // 在Java里的代碼  
  2. class CompilesFine {  
  3.  private int f = 0;  
  4.  public int f() {  
  5.   return 1;  
  6.  }  
  7. }  
但是相應(yīng)的Scala類將不能編譯:

  1. class WontCompile {  
  2.  private var f = 0  // 編譯不過,因?yàn)樽侄魏头椒ㄖ孛? 
  3.  def f = 1 
  4. }  

通常情況下,Scala僅為定義準(zhǔn)備了兩個命名空間,而Java有四個。Java的四個命名空間是字段,方法,類型和包。與之相對,Scala的兩個命名空間是:

 值(字段,方法,包還有單例對象)

 類型(類和特質(zhì)名)

Scala把字段和方法放進(jìn)同一個命名空間的理由很清楚,因?yàn)檫@樣你就可以使用val重載無參數(shù)的方法,這種你在Java里做不到的事情。Scala里包共享了與字段和方法相同的命名空間的原因是為了讓你能除了僅僅引用類型名以及單例對象的字段和方法之外,還能直接引用包。這同樣是你在Java中無法做到的。

定義參數(shù)化字段

再次考慮上一節(jié)中展示的ArrayElement類的定義。它有一個參數(shù)conts,其唯一目的是被復(fù)制到contents字段。選擇conts這個參數(shù)的名稱只是為了讓它看上去更像字段名contents而不會與它發(fā)生實(shí)際沖突。這是一種“代碼味道”,一個表明或許某些不必須的榮譽(yù)和重復(fù)在你代碼中出現(xiàn)的信號。

你可以通過在單一的參數(shù)化字段:parametric field定義中組合參數(shù)和字段避免這種代碼味道,展示在代碼10.5中:

  1. class ArrayElement(  // 請注意,小括號  
  2.  val contents: Array[String]  
  3. extends Element  

代碼 10.5 定義contents為參數(shù)化字段

注意現(xiàn)在contents參數(shù)前綴了val。這是在同一時間使用相同的名稱定義參數(shù)和字段的一個簡寫方式。尤其特別的是,類ArrayElement現(xiàn)在擁有一個可以從類外部訪問的,(不能重新賦值的)字段contents。字段使用參數(shù)值初始化。就好象類被寫成如下的方式,其中x123是參數(shù)的任意未曾用過的名字:

  1. class ArrayElement(x123: Array[String]) extends Element {  
  2.  val contents: Array[String] = x123  
  3. }  

同樣也可以使用var前綴類參數(shù),這種情況下相應(yīng)的字段將能重新被賦值。最終,還有可能添加如private,protected,protected修飾符,可以授權(quán)給子類訪問,將在第13章詳細(xì)描述。或override這類的修飾符到這些參數(shù)化字段上,就好象你可以在其他類成員上做的事情。比方說,考察下列類定義:

  1. class Cat {  
  2.  val dangerous = false 
  3. }  
  4. class Tiger(  
  5.  override val dangerous: Boolean,  
  6.  private var age: Int  
  7. extends Cat  

Tiger的定義是以下包括重載成員dangerous和private成員age的類定義替代寫法的簡寫:

  1. class Tiger(param1: Boolean, param2: Int) extends Cat {  
  2.  override val dangerous = param1  
  3.  private var age = param2  
  4. }  

兩個成員都初始化自相應(yīng)的參數(shù)。我們?nèi)我膺x擇了這些參數(shù)名,param1和param2。重要的是它們不會與范圍內(nèi)的任何其它名稱沖突。

【相關(guān)閱讀】

  1. Scala程序中的擴(kuò)展類
  2. 在Scala中定義無參數(shù)方法
  3. 學(xué)習(xí)Scala的二維布局庫和抽象類
  4. Scala學(xué)習(xí):叫名參數(shù)by-name parameter
  5. Scala:如何編寫新的控制結(jié)構(gòu)

 

責(zé)任編輯:book05 來源: Artima
相關(guān)推薦

2009-07-20 16:56:51

Scala類的定義

2009-07-21 12:47:04

Scala私有字段定義操作符

2009-07-22 07:53:00

Scala無參數(shù)方法

2009-07-21 13:54:55

Scala重載方法隱式轉(zhuǎn)換

2010-11-23 15:27:00

MySQL添加字段

2024-09-23 16:55:18

C#代碼開發(fā)

2010-09-02 09:29:02

SQL刪除字段

2010-09-28 14:27:35

SQL定義Xml

2010-11-22 11:38:08

MySQL添加字段

2009-07-21 12:24:01

Scala先決條件添加字段

2009-07-21 17:21:57

Scala定義函數(shù)

2009-08-27 10:06:15

Scala的構(gòu)造方法

2024-02-22 08:06:45

JSON策略解析器

2009-07-21 09:31:00

Scala基本類型文本

2009-12-11 10:42:00

Scala講座類定義構(gòu)造函數(shù)

2009-07-08 16:52:29

ScalaScala教程

2009-07-09 00:25:00

Scala參數(shù)化

2010-09-28 16:22:23

SQL ntext字段

2010-09-28 14:46:45

SQL Xml字段

2010-10-08 12:03:03

修改mysql字段
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 精品日韩欧美一区二区 | 爱高潮www亚洲精品 中文字幕免费视频 | 国产乱码精品一区二区三区中文 | 日本国产一区二区 | 亚洲综合色视频在线观看 | a级片播放 | 欧美精品在线播放 | 亚洲精品免费在线 | 日本h片在线观看 | 日韩视频精品在线 | 国产一区二区三区在线 | 天天天天操| 久久久综合 | 精品国产aⅴ | 91在线视频观看 | 九九综合九九 | 91精品久久久久久久久中文字幕 | 日韩二三区 | 亚洲啪啪 | 婷婷久久综合 | www.99热.com | 欧美国产激情二区三区 | av网址在线播放 | 精品国产乱码久久久久久蜜退臀 | 免费国产精品久久久久久 | 亚洲欧美一区二区三区视频 | 电影在线 | 成人免费视频网站 | 久久人爽爽人爽爽 | 一区在线视频 | 久久久999国产精品 中文字幕在线精品 | 欧美淫片| 国产精品国产精品国产专区不卡 | 在线观看中文视频 | 黄色国产在线视频 | 日韩中文一区 | 天天躁日日躁aaaa视频 | 国产精品日韩高清伦字幕搜索 | 国产精品久久欧美久久一区 | 国产成人av在线 | 天天久久 |