Menu
CoddyTech

Mengganti Method

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

Subclass dapat mengganti method yang diwarisi dengan versinya sendiri. Kata kunci override wajib digunakan, sehingga method tidak terganti secara tidak sengaja:

class Animal {
    func sound() -> String { "..." }
}

class Dog: Animal {
    override func sound() -> String { "Woof" }
}

class Cat: Animal {
    override func sound() -> String { "Meow" }
}

print(Dog().sound())
print(Cat().sound())
print(Animal().sound())

Output:

Woof
Meow
...

super.method() memanggil versi superclass dari dalam override, sehingga subclass dapat menambahkan perilaku pada yang diwarisi, alih-alih menggantikan semuanya:

class Report {
    func text() -> String { "Sales: 120" }
}

class SignedReport: Report {
    override func text() -> String {
        super.text() + " (signed by Ada)"
    }
}

print(SignedReport().text())

Output:

Sales: 120 (signed by Ada)

Property yang dihitung juga bisa ditimpa dengan override var:

class Shape {
    var sides: Int { 0 }
    var summary: String { "\(sides) sides" }
}

class Triangle: Shape {
    override var sides: Int { 3 }
}

print(Triangle().summary)

Output:

3 sides

Override tetap berjalan meskipun method dipanggil dari kode turunan: summary di atas ditulis di Shape, tetapi menggunakan sides milik Triangle. Swift selalu memanggil versi dari object yang sebenarnya, sehingga override berguna:

class Greeter {
    func name() -> String { "someone" }
    func greet() -> String { "Hello, \(name())" }
}

class AdaGreeter: Greeter {
    override func name() -> String { "Ada" }
}

let g: Greeter = AdaGreeter()
print(g.greet())

Output:

Hello, Ada
challenge icon

Tantangan

Mudah

Notification memiliki method render() yang mengembalikan [info] text. Deklarasikan subclass Warning, yang render()-nya mengembalikan [warn] TEXT (teks dalam huruf kapital), dan Reminder, yang menambahkan minutes tersimpan dan render()-nya mengembalikan hasil superclass diikuti (in 10 min), dengan menggunakan super.

Kode yang disediakan membaca baris info,text, warn,text, atau remind,text,10, membuat object yang sesuai dalam sebuah array berisi Notification, lalu mencetak render() untuk masing-masing object.

Tulis kodemu di Notification.swift, Warning.swift, dan Reminder.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) }
var all: [Notification] = []
for line in input {
    let p = line.split(separator: ",").map(String.init)
    switch p[0] {
    case "warn": all.append(Warning(text: p[1]))
    case "remind":
        let r = Reminder(text: p[1])
        r.minutes = Int(p[2])!
        all.append(r)
    default: all.append(Notification(text: p[1]))
    }
}
for n in all { print(n.render()) }
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