版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年黑龍江農(nóng)墾科技職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試參考題庫有答案解析
- 2026年撫順職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試參考題庫帶答案解析
- 投資合作合同協(xié)議(新能源2025年)
- 2026年海南健康管理職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試模擬試題帶答案解析
- 2026年渤海船舶職業(yè)學(xué)院單招綜合素質(zhì)筆試備考試題帶答案解析
- 2026年桂林生命與健康職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試備考題庫帶答案解析
- 司法鑒定數(shù)據(jù)服務(wù)合同(2025年DNA分析)
- 2026年貴州工程職業(yè)學(xué)院單招綜合素質(zhì)筆試備考題庫帶答案解析
- 2026年川南幼兒師范高等??茖W(xué)校單招綜合素質(zhì)筆試模擬試題帶答案解析
- 2026年廣東工程職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試模擬試題帶答案解析
- 弘揚(yáng)工匠精神課件
- 2025中級(jí)客房服務(wù)員資格考試題庫及答案(濃縮300題)
- 業(yè)務(wù)技術(shù)用房維修改造項(xiàng)目信息化工程投標(biāo)方案(技術(shù)標(biāo))
- 大中型企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化管理體系要求變化解讀
- 2022埋地輸水鋼管設(shè)計(jì)與施工技術(shù)規(guī)范
- 2025屆高考數(shù)學(xué)二輪復(fù)習(xí)備考策略和方向
- UL1995標(biāo)準(zhǔn)中文版-2018加熱和冷卻設(shè)備UL中文版標(biāo)準(zhǔn)
- 2024至2030年中國家用燃?xì)饩邤?shù)據(jù)監(jiān)測研究報(bào)告
- 2024版租房合同協(xié)議書下載
- 寶寶喂養(yǎng)記錄表
- 丹鹿通督片治療腰椎疾病所致腰椎狹窄128例
評(píng)論
0/150
提交評(píng)論