偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

重載方法和字段

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

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

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

51CTO編輯推薦:Scala編程語(yǔ)言專題

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

另一方面,Scala里禁止在同一個(gè)類里用同樣的名稱定義字段和方法,而在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  // 編譯不過(guò),因?yàn)樽侄魏头椒ㄖ孛? 
  3.  def f = 1 
  4. }  

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

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

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

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

定義參數(shù)化字段

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

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

  1. class ArrayElement(  // 請(qǐng)注意,小括號(hào)  
  2.  val contents: Array[String]  
  3. extends Element  

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

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

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

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

  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的類定義替代寫法的簡(jiǎn)寫:

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

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

【相關(guān)閱讀】

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

 

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

2009-07-20 16:56:51

Scala類的定義

2009-07-21 12:47:04

Scala私有字段定義操作符

2009-07-22 07:53:00

Scala無(wú)參數(shù)方法

2009-07-21 13:54:55

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

2010-11-23 15:27:00

MySQL添加字段

2024-09-23 16:55:18

C#代碼開(kāi)發(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-12-11 10:42:00

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

2009-07-21 09:31:00

Scala基本類型文本

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ù)棧公眾號(hào)