Private

私有訪問(wèn)修飾符限制它所定義的實(shí)體以及實(shí)體中的任何類(lèi)型的訪問(wèn)——也稱(chēng)為“詞匯范圍”。同一源文件中類(lèi)型的擴(kuò)展也可以訪問(wèn)實(shí)體的。

為了證明這一點(diǎn),可以通過(guò)擴(kuò)展BasicAccount創(chuàng)建一個(gè)CheckingAccount(支票賬戶)。

class CheckingAccount: BasicAccount {
  private let accountNumber = UUID().uuidString
  class Check {
    let account: String
    var amount: Dollars
    //兌現(xiàn)
    private(set) var cashed = false
    func cash() {
      cashed = true
    }
    init(amount: Dollars, from account: CheckingAccount) {
      self.amount = amount
      self.account = account.accountNumber
    }
  } 
}

CheckingAccount有一個(gè)聲明為private的accountNumber。CheckingAccount還有一個(gè)嵌套類(lèi)Check,可以在其初始化方法中讀取私有值accountNumber。

注意:在本例中,UUID類(lèi)用于生成唯一的帳戶號(hào)。這個(gè)類(lèi)是Foundation的一部分,所以不要忘記導(dǎo)入它!

CheckingAccount能夠開(kāi)支票和兌換現(xiàn)金。在CheckingAccount中添加以下方法:

func writeCheck(amount: Dollars) -> Check? {
  guard balance > amount else {
    return nil
  }
  let check = Check(amount: amount, from: self)
  withdraw(amount: check.amount)
  return check
}

func deposit(_ check: Check) {
  guard !check.cashed else {
    return
  }
  deposit(amount: check.amount)
  check.cash()
}

雖然CheckingAccount仍然可以進(jìn)行基本的存款和取款,但是它現(xiàn)在的 writeCheck(amount:) 在提取金額和創(chuàng)建支票之前需要檢查是否有足夠的余額,并且如果支票已經(jīng)兌現(xiàn),那么deposit(_:)方法將不會(huì)存款。

讓約翰給簡(jiǎn)寫(xiě)張支票,在你的playground上試一試這個(gè)代碼。

// 創(chuàng)建一個(gè)John的支票賬戶存入 $300.00
let johnChecking = CheckingAccount()
johnChecking.deposit(amount: 300.00)
// 開(kāi)一個(gè) $200.00的支票
let check = johnChecking.writeCheck(amount: 200.0)!
// 創(chuàng)建一個(gè)Jane的支票賬戶, 把 john的支票存進(jìn)去
let janeChecking = CheckingAccount()
janeChecking.deposit(check)
janeChecking.balance // 200.00
// 再次把支票存入,沒(méi)有影響。
// Jane's balance this time :]
janeChecking.deposit(check)
janeChecking.balance // 200.00

使用點(diǎn)語(yǔ)法查看哪些是CheckingAccount的接口。

QQ20180717-094616@2x.png

accountNumber被視為CheckingAccount的實(shí)現(xiàn)細(xì)節(jié),對(duì)于使用代碼是不可見(jiàn)的。

同時(shí),Check使cashed私有了,所以使用cash()方法代替

QQ20180717-095207@2x.png

這個(gè)接口提供了一種方法,可以將支票標(biāo)記為已經(jīng)兌換,但不能反過(guò)來(lái)。換句話說(shuō),不可能取消兌現(xiàn)支票。

最后,盡管在CheckingAccount無(wú)法看到accountNumber,但是任何持有支票的人都可以訪問(wèn)這個(gè)號(hào)碼:


QQ20180717-095917@2x.png

重要的是,不管這個(gè)代碼是如何實(shí)現(xiàn)的,訪問(wèn)修飾符讓代碼形成自己的接口。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容