Kelas Terbuka dan Subkelas
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 17 dari 57.
Pewarisan memungkinkan satu class dibangun berdasarkan class lain. Subclass mendapatkan setiap property dan method dari superclass-nya dan dapat menambahkan miliknya sendiri. Secara default, class Kotlin bersifat tertutup, jadi class harus ditandai dengan open sebelum class lain dapat mewarisinya:
open class Animal(val name: String) {
fun describe() = "$name is an animal"
}
class Dog(name: String) : Animal(name) {
fun fetch() = "$name fetches the ball"
}Di dalam main:
val rex = Dog("Rex")
println(rex.describe())
println(rex.fetch())Output:
Rex is an animal
Rex fetches the ballclass Dog(name: String) : Animal(name) menyatakan bahwa Dog memperluas Animal dan meneruskan name ke konstruktor superclass. Parameter ini tidak memiliki val, karena property tersebut sudah ada di Animal. Class yang tidak open tidak dapat diperluas:
class Plant(val name: String)
// class Tree(name: String) : Plant(name) // error: tipe ini bersifat final, jadi tidak bisa diwarisi
open class Vehicle(val wheels: Int)
class Bike : Vehicle(2) // meneruskan nilai tetap
class Truck(val load: Int) : Vehicle(6) // menambahkan property miliknya sendiriDog adalah Animal, jadi instance subclass dapat digunakan di mana pun tipe superclass diharapkan. Satu List<Animal> dapat menampung dog, cat, dan animal biasa, dan setiap elemennya memiliki anggota Animal:
open class Animal(val name: String) {
fun describe() = "$name is an animal"
}
class Dog(name: String) : Animal(name)
class Cat(name: String, val indoor: Boolean) : Animal(name)Di dalam main:
val pets: List<Animal> = listOf(Dog("Rex"), Cat("Tom", true), Animal("Generic"))
for (p in pets) println(p.describe())Output:
Rex is an animal
Tom is an animal
Generic is an animalPewarisan memodelkan relasi is-a: seekor anjing adalah hewan, rekening tabungan adalah rekening. Jika satu class hanya menggunakan class lain (mobil memiliki mesin), berikan property dengan tipe tersebut. Secara default, class Kotlin bersifat tertutup, jadi class yang dimaksudkan untuk diperluas harus menyatakannya dengan open, sementara class lainnya menjaga perilakunya agar tetap aman dari subclass.
open class Account(val owner: String)
class SavingsAccount(owner: String) : Account(owner) // is-a: pewarisan
class Engine(val horsepower: Int)
class Car(val engine: Engine) // has-a: sebuah propertyTantangan
MudahManager mengulang hal yang sudah dimiliki Employee. Jadikan Employee open dan ubah Manager menjadi subclass-nya: Manager(name: String, salary: Int) meneruskan kedua nilai ke Employee dan hanya menyimpan hal yang baru, yaitu list privat berisi nama-nama laporan dengan addReport(name) dan teamSize(). Di Employee, raise(percent) menaikkan gaji sebesar persentase tersebut, dibulatkan ke bawah, dan describe() mengembalikan Ada earns 5500.
Kode yang disediakan membuat manager dari baris pertama (name,salary), menambahkan setiap nama berikutnya sebagai laporan, menaikkan gaji sebesar 10% dan mencetak Ada earns 5500 and leads 2, lalu memeriksa bahwa manager adalah Employee.
Letakkan kodemu di Employee.kt dan Manager.kt. Main.kt berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
fun main() {
// Kode input/output yang disediakan: biarkan apa adanya
val input = generateSequence(::readLine).toList()
val (name, salary) = input[0].split(",")
val boss = Manager(name, salary.toInt())
for (report in input.drop(1)) boss.addReport(report)
boss.raise(10)
println("${boss.describe()} and leads ${boss.teamSize()}")
println("a manager is an employee: ${(boss as Any) is Employee}")
}
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 classKonstruktor utamaBlok init dan validasiKonstruktor sekunderRingkasan: Kartu Perpustakaan4Pewarisan
Kelas Terbuka dan SubkelasMenimpa Anggotasuper dan KonstruktorKelas AbstrakUlasan: Direktori Staf2property dan Enkapsulasi
Accessor KustomModifier VisibilitasSetter Privatlazy dan lateinitRingkasan: Rekening Bank5Interface
Mendeklarasikan Interfacemethod DefaultBeberapa InterfaceInterface sebagai TipeUlasan: Metode Pembayaran11Proyek: Pengelolaan Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Kotlin