Menu
CoddyTech

Inisialisasi dan super

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 24 dari 57.

Saat subclass menambahkan property tersimpan tanpa nilai default, subclass tersebut memerlukan initializer sendiri. Pertama, subclass mengatur property-nya sendiri, lalu memanggil initializer superclass dengan super.init(...):

class Animal {
    let name: String
    init(name: String) { self.name = name }
}

class Bird: Animal {
    let canFly: Bool

    init(name: String, canFly: Bool) {
        self.canFly = canFly
        super.init(name: name)
    }
}

let p = Bird(name: "Pip", canFly: false)
print("\(p.name) \(p.canFly)")

Output:

Pip false

Urutannya penting: property subclass harus memiliki nilai sebelum super.init dijalankan, dan property yang diwarisi hanya dapat digunakan setelahnya. Swift memeriksa hal ini saat kompilasi:

init(name: String, canFly: Bool) {
    // print(self.name)      // error: self digunakan sebelum super.init
    self.canFly = canFly     // 1. property milik sendiri
    super.init(name: name)   // 2. superclass
    print(self.name)         // 3. sekarang semuanya bisa digunakan
}

Setelah subclass mendefinisikan initializer-nya sendiri, initializer superclass tidak lagi diwarisi. Subclass juga dapat mengganti initializer dengan parameter yang sama, dengan menandainya sebagai override init:

class Timer {
    var seconds: Int
    init(seconds: Int) { self.seconds = seconds }
}

class SafeTimer: Timer {
    override init(seconds: Int) {
        super.init(seconds: max(0, seconds))
    }
}

print(SafeTimer(seconds: -5).seconds)
print(SafeTimer(seconds: 30).seconds)

Output:

0
30

Setiap tingkat hierarki menginisialisasi bagiannya sendiri dan menyerahkan sisanya kepada superclass-nya, sehingga setiap property dalam rantai mendapatkan nilai tepat satu kali:

class Vehicle {
    let wheels: Int
    init(wheels: Int) { self.wheels = wheels }
}

class Car: Vehicle {
    let seats: Int
    init(seats: Int) {
        self.seats = seats
        super.init(wheels: 4)
    }
}

class Taxi: Car {
    let company: String
    init(company: String) {
        self.company = company
        super.init(seats: 5)
    }
}

let t = Taxi(company: "City Cabs")
print("\(t.company): \(t.wheels) wheels, \(t.seats) seats")

Output:

City Cabs: 4 wheels, 5 seats
challenge icon

Tantangan

Mudah

Product menyimpan name dan price (dalam sen). Deklarasikan subclass DiscountedProduct dengan percent tersimpan. Initializer-nya menerima name, price, dan percent, menyimpan percent, lalu memanggil super.init dengan harga yang sudah dikurangi berdasarkan persentase (dibulatkan ke bawah). Nilai percent di luar rentang 0-100 dianggap 0. Tambahkan method label() di DiscountedProduct yang mengembalikan tea: 450 (10% off).

Kode yang disediakan membaca baris name,price,percent, membuat DiscountedProduct untuk setiap baris, lalu mencetak label().

Tempatkan kodemu di Product.swift dan DiscountedProduct.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

// Kode input/output yang disediakan: biarkan apa adanya
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
    let p = line.split(separator: ",").map { String($0) }
    let item = DiscountedProduct(name: p[0], price: Int(p[1])!, percent: Int(p[2])!)
    print(item.label())
}
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