Menu
CoddyTech

Polimorfisme

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

Polymorphism berarti satu bagian kode bekerja dengan nilai dari berbagai tipe, dan setiap nilai merespons dengan caranya sendiri. Perulangan di bawah memanggil sound() tanpa mengetahui hewan apa yang dimilikinya:

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

let farm: [Animal] = [Dog(), Cow(), Dog()]
for a in farm { print(a.sound()) }

Output:

Woof
Moo
Woof

Swift menentukan implementasi yang akan dijalankan saat runtime, berdasarkan object yang sebenarnya. Tipe yang dideklarasikan untuk variabel tidak penting, yang penting adalah tipe object:

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

let pet: Animal = Cat()
print(pet.sound())

Output:

Meow

Protokol memberikan fleksibilitas yang sama kepada struct dan enum. Di sini, satu fungsi mencetak nilai Drawable apa pun dalam sebuah list:

protocol Drawable {
    func draw() -> String
}
struct Line: Drawable {
    let length: Int
    func draw() -> String { String(repeating: "-", count: length) }
}
struct Box: Drawable {
    func draw() -> String { "[ ]" }
}

func render(_ items: [any Drawable]) -> String {
    items.map { $0.draw() }.joined(separator: " ")
}

print(render([Line(length: 3), Box(), Line(length: 1)]))

Output:

--- [ ] -

Polimorfisme menggantikan rangkaian if/switch panjang yang memeriksa jenis sesuatu. Alih-alih menanyakan apa nilai itu lalu memutuskan tindakan yang harus dilakukan, kamu meminta nilai itu untuk melakukannya. Menambahkan jenis baru berarti menambahkan tipe baru, bukan mengedit setiap switch:

// tanpa polimorfisme
if kind == "dog" { print("Woof") } else if kind == "cow" { print("Moo") }

// dengan polimorfisme
for animal in farm { print(animal.sound()) }
challenge icon

Tantangan

Mudah

Animal memiliki name, legs() (4), dan describe(), yang mengembalikan Rex has 4 legs and says Woof yang dibuat dari legs() dan sound(). Deklarasikan Dog (suara Woof), Bird (2 kaki, suara Tweet), dan Snake (0 kaki, suara Hiss) dengan hanya melakukan override pada legs() dan sound().

Kode yang disediakan membaca baris dog,Rex, bird,Pip, atau snake,Kaa, menyimpan hewan-hewan tersebut dalam satu array [Animal], lalu mencetak describe() untuk setiap hewan.

Tulis kodemu di Animal.swift, Dog.swift, Bird.swift, dan Snake.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

// Kode input/output yang disediakan: biarkan tetap seperti semula
var input: [String] = []
while let line = readLine() { input.append(line) }
var zoo: [Animal] = []
for line in input {
    let p = line.split(separator: ",").map(String.init)
    switch p[0] {
    case "dog": zoo.append(Dog(name: p[1]))
    case "bird": zoo.append(Bird(name: p[1]))
    default: zoo.append(Snake(name: p[1]))
    }
}
for a in zoo { print(a.describe()) }
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