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 falseUrutannya 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
30Setiap 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 seatsTantangan
MudahProduct 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())
}
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