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
WoofSwift 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:
MeowProtokol 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()) }Tantangan
MudahAnimal 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()) }
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