Menu
CoddyTech

Subclass

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

Inheritance memungkinkan sebuah class dibangun berdasarkan class lain. class Dog: Animal menjadikan Dog sebagai subclass dari superclass Animal: seekor anjing memiliki semua property dan method milik hewan, ditambah hal-hal yang ditambahkan oleh Dog:

class Animal {
    var name: String
    init(name: String) { self.name = name }
    func describe() -> String { "\(name) is an animal" }
}

class Dog: Animal {
    func fetch() -> String { "\(name) fetches the ball" }
}

let rex = Dog(name: "Rex")
print(rex.describe())
print(rex.fetch())

Output:

Rex is an animal
Rex fetches the ball

Subclass yang tidak menambahkan property tersimpan akan mewarisi initializer superclass. Itulah sebabnya Dog(name:) berfungsi tanpa init di Dog. Pewarisan memodelkan hubungan is-a: setiap anjing adalah hewan, jadi Dog dapat digunakan di mana pun Animal diharapkan:

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

class Cat: Animal {}
class Dog: Animal {}

let pets: [Animal] = [Cat(name: "Tom"), Dog(name: "Rex")]
for pet in pets { print(pet.name) }

Output:

Tom
Rex

Hanya class yang mendukung pewarisan. struct dan enum tidak dapat mewarisi. Sebuah class memiliki paling banyak satu superclass, tetapi sebuah superclass dapat memiliki banyak subclass sehingga membentuk hierarki:

class Vehicle { var wheels = 0 }
class Car: Vehicle { }        // Car adalah Vehicle
class Bike: Vehicle { }       // Bike adalah Vehicle
// struct Truck: Vehicle { }  // error: struct tidak dapat mewarisi

Letakkan semua hal yang dimiliki bersama oleh semua subclass di superclass, dan hanya perbedaannya di setiap subclass. Jika satu tipe sebenarnya bukan jenis dari tipe lainnya, pewarisan bukanlah alat yang tepat; property yang menyimpan tipe lainnya sering kali lebih cocok.

class Shape {
    var name: String
    init(name: String) { self.name = name }
    func label() -> String { "a \(name)" }
}

class Square: Shape {
    var side = 1.0
    func area() -> Double { side * side }
}

let s = Square(name: "square")
s.side = 3
print(s.label())
print(s.area())

Output:

a square
9.0
challenge icon

Tantangan

Mudah

Employee menyimpan name dan salary, serta memiliki method raise(by:) yang menaikkan gaji sebesar persentase tertentu (dibulatkan ke bawah). Deklarasikan subclass Manager yang menambahkan stored property reports (array nama, awalnya kosong) dan method addReport(_:), serta method teamSize() yang mengembalikan jumlah laporan.

Kode yang disediakan membuat manager dari baris pertama (name,salary), menambahkan setiap nama berikutnya sebagai laporan, memberikan kenaikan gaji 10%, lalu mencetak Ada earns 5500 and leads 2.

Tulis kodemu di Employee.swift dan Manager.swift. main.swift berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

// Kode input/output yang disediakan: biarkan apa adanya
var input: [String] = []
while let line = readLine() { input.append(line) }
let head = input[0].split(separator: ",").map(String.init)
let boss = Manager(name: head[0], salary: Int(head[1])!)
for name in input.dropFirst() { boss.addReport(name) }
boss.raise(by: 10)
print("\(boss.name) earns \(boss.salary) and leads \(boss.teamSize())")
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