final dan Hierarki
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 25 dari 57.
final mencegah penggantian lebih lanjut. final func tidak dapat diganti di subclass mana pun, dan final class sama sekali tidak dapat dijadikan superclass:
class Account {
final func id() -> String { "ACC" } // tidak bisa ditimpa
}
final class Receipt { } // tidak bisa dijadikan superclass
// class GiftReceipt: Receipt { } // error: pewarisan dari class finalTandai method sebagai final ketika subclass tidak boleh mengubahnya, misalnya method yang menegakkan aturan. Method lainnya tetap bisa di-override untuk menyesuaikan detail:
class Checkout {
final func total(_ prices: [Int]) -> Int {
let sum = prices.reduce(0, +)
return sum - discount(sum)
}
func discount(_ sum: Int) -> Int { 0 }
}
class SaleCheckout: Checkout {
override func discount(_ sum: Int) -> Int { sum / 10 }
}
print(Checkout().total([50, 50]))
print(SaleCheckout().total([50, 50]))Output:
100
90Hierarki dapat memiliki beberapa tingkat. Sebuah method dicari mulai dari class milik object sendiri ke atas, lalu implementasi pertama yang ditemukan akan dijalankan:
class Animal {
func move() -> String { "moves" }
func eat() -> String { "eats" }
}
class Bird: Animal {
override func move() -> String { "flies" }
}
class Penguin: Bird {
override func move() -> String { "swims" }
}
let p = Penguin()
print(p.move())
print(p.eat())Output:
swims
eatsBuat hierarki tetap dangkal. Rantai yang panjang sulit diikuti, karena perilaku satu object tersebar di banyak class. Saat tipe berbagi perilaku tanpa relasi is-a, protocol (bab berikutnya) biasanya menjadi pilihan yang lebih baik.
// berlapis-lapis dan rapuh
class A { }
class B: A { }
class C: B { }
class D: C { } // apa yang diwarisi D, dan dari mana?Tantangan
MudahDiscount memiliki method final apply(to:) yang mengembalikan harga dikurangi amount(for:), tetapi hasilnya tidak pernah kurang dari 0, dan amount(for:) mengembalikan 0. Deklarasikan PercentOff (percent tersimpan, jumlah = harga dikali percent / 100) dan FixedOff (value tersimpan, jumlah = value), masing-masing dengan initializer dan override untuk amount(for:). apply(to:) sendiri tetap berada di Discount.
Kode yang disediakan membaca harga, lalu diskon p,10 atau f,300, menerapkan masing-masing diskon ke harga, lalu mencetak 1000 -> 900.
Kodemu ditulis di Discount.swift, PercentOff.swift, dan FixedOff.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
// Kode input/output yang disediakan: biarkan seperti adanya
var input: [String] = []
while let line = readLine() { input.append(line) }
let price = Int(input[0])!
for line in input.dropFirst() {
let p = line.split(separator: ",").map(String.init)
let d: Discount = p[0] == "p" ? PercentOff(percent: Int(p[1])!) : FixedOff(value: Int(p[1])!)
print("\(price) -> \(d.apply(to: price))")
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Class dan Object
Bekerja dengan FileMendefinisikan ClassMethod dan selfInitializerClass adalah ReferensiUlasan: Kartu Perpustakaan4Enkapsulasi
Kontrol AksesHanya Bisa Dibaca dari LuarMelindungi StateInitializer yang Bisa GagalRangkuman: Rekening Bank7Polimorfisme dan Generik
PolimorfismeKonversi TipeFungsi GenerikTipe GenerikRangkuman: Kalkulator Bentuk2Struct dan Tipe Nilai
StructSemantik NilaiMethod yang Mengubah NilaiStruct atau classRangkuman, Item Inventaris11Proyek: Manajemen Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Swift