Menu
CoddyTech

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 final

Tandai 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
90

Hierarki 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
eats

Buat 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?
challenge icon

Tantangan

Mudah

Discount 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))")
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Swift