敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第18章 抽象成員_第1頁
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第18章 抽象成員_第2頁
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第18章 抽象成員_第3頁
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第18章 抽象成員_第4頁
敏捷硬件開發(fā)語言Chisel與數(shù)字系統(tǒng)設(shè)計(jì) 課件 第18章 抽象成員_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

18.抽象成員一、抽象成員的基本介紹二、初始化抽象val字段三、抽象類型四、細(xì)化類型五、Scala的枚舉目

錄2一、抽象成員的基本介紹3一、抽象成員的基本介紹抽象類和特質(zhì)中的那些沒有完整定義的成員。所謂沒有完整定義,意思就是字段沒有初始值或者函數(shù)沒有函數(shù)體。1.1抽象成員的定義1.2抽象成員的四種類型traitAbstract{

typeT//抽象類型

deftransform(x:T):T//抽象方法

valinitial:T//抽象val字段

varcurrent:T//抽象var字段

}typeT=string相當(dāng)于為string聲明了一個(gè)別名T,此時(shí)在需要使用string的地方就可以直接使用T來代替。4一、抽象成員的基本介紹因?yàn)槌蓡T定義不充分,存在不可初始化的字段和類型,或者沒有函數(shù)體的方法,所以抽象類和特質(zhì)不能直接用new構(gòu)造實(shí)例。那就需要繼承該特質(zhì)或者類的子類去實(shí)現(xiàn)。雖然抽象類和特質(zhì)都定義了一種類型,并且它們是抽象的,但這不意味著抽象類或特質(zhì)就叫抽象類型,抽象類型永遠(yuǎn)都是指的類和特質(zhì)的成員,而不是類和特質(zhì)本身。1.3注意事項(xiàng)classConcreteextendsAbstract{

typeT=String

deftransform(x:String)=x+x

valinitial="hi"

varcurrent=initial

}5二、初始化抽象val字段6二、初始化抽象val字段為超類或超特質(zhì)提供參數(shù),允許程序員在子類中提供那些在超類或者超

特質(zhì)中缺失的細(xì)節(jié)。2.1抽象val字段的作用classAnonymousClassextendsRationalTrait

{

valnumerArg=1

valdenomArg=2

}

newAnonymousClasstraitRationalTrait{

valnumerArg:Int

valdenomArg:Int

}

newRationalTrait{

valnumerArg=1

valdenomArg=2

}匿名類7二、初始化抽象val字段2.2一種常見的錯(cuò)誤在構(gòu)造超特質(zhì)的組件時(shí),因?yàn)樘刭|(zhì)不能接收子類的參數(shù),如果默認(rèn)值不滿足某些要求,構(gòu)造就會(huì)出錯(cuò)。構(gòu)造超特質(zhì)RationalTrait組件時(shí),會(huì)執(zhí)行到這一句?。?!scala>traitRationalTrait{

|valnumerArg:Int

|valdenomArg:Int

|require(denomArg!=0)

|}

definedtraitRationalTrait

scala>newRationalTrait{

|valnumerArg=1

|valdenomArg=2

|}

java.lang.IllegalArgumentException:requirementfailed

atscala.Predef$.require(Predef.scala:264)

atRationalTrait.$init$(<console>:14)

...32elided8二、初始化抽象val字段2.3預(yù)初始化字段匿名類使用預(yù)初始化字段的形式:new{定義}with超類/超特質(zhì)scala>new{

|valnumerArg=1

|valdenomArg=2

|}withRationalTrait注意和不使用預(yù)初始化字段時(shí)的書寫形式的區(qū)別?具名子類使用預(yù)初始化字段scala>classRationalClass(n:Int,d:Int)extends{

|valnumerArg=n

|valdenomArg=d

|}withRationalTrait

definedclassRationalClass

scala>newRationalClass(1,2)

res1:RationalClass=RationalClass@6f26e7759二、初始化抽象val字段2.4惰性的val字段-作用預(yù)初始化字段是人為地調(diào)整初始化順序,而把val字段定義成惰性的,則可以讓程序自己確定初始化順序。在val字段前面加上關(guān)鍵字“l(fā)azy”,那么該字段只有首次被使用時(shí)才會(huì)進(jìn)行初始化。如果是用表達(dá)式進(jìn)行初始化,那就對(duì)表達(dá)式求值并保存,后續(xù)使用字段時(shí)都是復(fù)用保存的結(jié)果而不是每次都求值表達(dá)式。10二、初始化抽象val字段2.5惰性的val字段-舉例scala>traitLazyRationalTrait{

|valnumerArg:Int

|valdenomArg:Int

|lazyvalnumer=numerArg/g

|lazyvaldenom=denomArg/g

|overridedeftoString=numer+"/"+denom

|privatelazyvalg={

|require(denomArg!=0)

|gcd(numerArg,denomArg)

|}

|privatedefgcd(a:Int,b:Int):Int=

|if(b==0)aelsegcd(b,a%b)

|}

definedtraitLazyRationalTraitscala>valx=2

x:Int=2

scala>newLazyRationalTrait{

|valnumerArg=1*x

|valdenomArg=2*x

|}

res0:LazyRationalTrait=1/2抽象成員惰性的val字段私有方法注意和使用預(yù)初始化字段時(shí)的書寫形式不一樣11三、抽象類型12三、抽象類型假設(shè)要編寫一個(gè)Food類,用各種子類來表示各種食物。然后再編寫一個(gè)抽象的Animal類,有一個(gè)eat方法,接收Food類型的參數(shù)。那么可能會(huì)寫成如下形式:3.1問題引出scala>classFood

definedclassFood

scala>abstractclassAnimal{

|defeat(food:Food)

|}

definedclassAnimalFood類Animal類eat方法13三、抽象類型如果用不同的Animal子類來代表不同的動(dòng)物,并且食物類型也會(huì)根據(jù)動(dòng)物的習(xí)性發(fā)生改變。比如定義一頭吃草的牛,那么可能定義如下:3.1問題引出scala>classGrassextendsFood

definedclassGrass

scala>classCowextendsAnimal{

|overridedefeat(food:Grass)={}

|}definedclassCow思考一下這種形式編譯為什么會(huì)出錯(cuò)?14三、抽象類型3.2抽象類型的上界scala>classFooddefinedclassFood

scala>abstractclassAnimal{

|typeSuitableFood<:Food

|defeat(food:SuitableFood)

|}

definedclassAnimal

scala>classGrassextendsFooddefinedclassGrass

scala>classCowextendsAnimal{

|typeSuitableFood=Grass

|overridedefeat(food:Grass)={}

|}definedclassCow上界,<:表示SuitableFood必須是Food的某個(gè)子類定義食物為草15三、抽象類型3.2抽象類型的上界如果現(xiàn)在給吃草的牛喂一條魚,那么就會(huì)發(fā)生類型錯(cuò)誤:scala>classFishextendsFood

definedclassFish

scala>valbessy:Animal=newCow

bessy:Animal=Cow@2442f36d

scala>bessyeat(newFish)

<console>:14:error:typemismatch;

found:Fish

required:bessy.SuitableFood

bessyeat(newFish)

^16四、細(xì)化類型17四、細(xì)化類型第一種方法是定義一個(gè)食草的特質(zhì),讓所有的食草動(dòng)物類都混入該特質(zhì)。但是這樣會(huì)讓食草動(dòng)物與最基本的動(dòng)物的關(guān)系不那么緊密。第二種方法是繼承自Animal類,那么食草動(dòng)物集合的元素類型就可以表示為Animal類型,但這樣又可能把食肉動(dòng)物或雜食動(dòng)物也包含進(jìn)集合。此時(shí),就可以使用結(jié)構(gòu)子類型。4.1問題引出---做一個(gè)食草動(dòng)物的集合18四、細(xì)化類型當(dāng)一個(gè)類繼承自另一個(gè)類時(shí),就稱前者是后者的名義子類型。Scala還有一個(gè)結(jié)構(gòu)子類型,表示兩個(gè)類型只是有某些兼容的成員,而不是常規(guī)的那種繼承來的關(guān)系。結(jié)構(gòu)子類型通過細(xì)化類型來表示。例如:

4.2細(xì)化類型Animal{typeSuitableFood=Grass}valanimals:List[Animal{typeSuitableFood=Grass}]=???和Animal相比更具體和精細(xì),屬于細(xì)化類型AnimalVS19集合中的元素必須是Animal的子類型,而且食物類型必須是草。五、Scala的枚舉20五、Scala的枚舉Scala沒有特定的語法表示枚舉,而是在標(biāo)準(zhǔn)類庫中提供一個(gè)枚舉類:通過創(chuàng)建一個(gè)繼承自這個(gè)類的子對(duì)象可以創(chuàng)建枚舉。例如:5.1枚舉的定義方式一對(duì)象Color和普通的單例對(duì)象一樣,可以通過“Color.Red”這樣的方式來訪問成員,或者先用“importColor._”導(dǎo)入。scala.Enumerationscala>objectColorextendsEnumeration{

|valRed,Green,Blue=Value

|}

definedobjectColor21五、Scala的枚舉方法Value有一個(gè)重載的版本,可以接收一個(gè)字符串參數(shù)來給枚舉值關(guān)聯(lián)特定的名稱。例如:5.2枚舉的定義方式二scala>objectDirectionextendsEnumeration{

|valNorth=Value("N")

|valEast=Value("E")

|valSouth=Value("S")

|valWest=Value("W")

|

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論