私有訪問修飾符限制它所定義的實(shí)體以及實(shí)體中的任何類型的訪問——也稱為“詞匯范圍”葡幸。同一源文件中類型的擴(kuò)展也可以訪問實(shí)體的剖笙。
為了證明這一點(diǎn)臭蚁,可以通過擴(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è)嵌套類Check肛跌,可以在其初始化方法中讀取私有值accountNumber。
注意:在本例中察郁,UUID類用于生成唯一的帳戶號(hào)衍慎。這個(gè)類是Foundation的一部分,所以不要忘記導(dǎo)入它!
CheckingAccount能夠開支票和兌換現(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ì)存款乔夯。
讓約翰給簡寫張支票砖织,在你的playground上試一試這個(gè)代碼。
// 創(chuàng)建一個(gè)John的支票賬戶存入 $300.00
let johnChecking = CheckingAccount()
johnChecking.deposit(amount: 300.00)
// 開一個(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
// 再次把支票存入末荐,沒有影響侧纯。
// Jane's balance this time :]
janeChecking.deposit(check)
janeChecking.balance // 200.00
使用點(diǎn)語法查看哪些是CheckingAccount的接口。
accountNumber被視為CheckingAccount的實(shí)現(xiàn)細(xì)節(jié)甲脏,對于使用代碼是不可見的眶熬。
同時(shí),Check使cashed私有了块请,所以使用cash()方法代替
這個(gè)接口提供了一種方法娜氏,可以將支票標(biāo)記為已經(jīng)兌換,但不能反過來墩新。換句話說贸弥,不可能取消兌現(xiàn)支票。
最后海渊,盡管在CheckingAccount無法看到accountNumber绵疲,但是任何持有支票的人都可以訪問這個(gè)號(hào)碼:
重要的是,不管這個(gè)代碼是如何實(shí)現(xiàn)的臣疑,訪問修飾符讓代碼形成自己的接口盔憨。