Eşlikçi Nesneler
Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 13 / 57.
Bazı üyeler tek bir örneğe değil, bir bütün olarak sınıfa aittir. Kotlin bunları sınıfın içindeki bir companion object içine yerleştirir ve onlara sınıf adı üzerinden erişirsiniz:
class Temperature(val celsius: Double) {
companion object {
fun fromFahrenheit(f: Double) = Temperature((f - 32) * 5 / 9)
}
}main içinde:
val boiling = Temperature.fromFahrenheit(212.0)
println(boiling.celsius)Çıktı:
100.0fromFahrenheit bir fabrika fonksiyonudur: örnekler oluşturan bir fonksiyon. Bir oluşturucudan farklı olarak açıklayıcı bir adı vardır ve bir nesne yerine null döndürebilir. private constructor ile fabrikaya girişin tek yolu budur; böylece önce girdiyi kontrol edip temizleyebilir:
class Username private constructor(val text: String) {
companion object {
fun of(raw: String): Username? {
val clean = raw.trim().lowercase()
return if (clean.length in 3..12) Username(clean) else null
}
}
}main içinde:
println(Username.of(" Ada_L ")?.text)
println(Username.of("x")?.text)
// Username("x") // hata: kurucu privateÇıktı:
ada_l
nullYardımcı nesne sınıfa aittir; bu nedenle private kurucuyu çağırabilir ve sınıfın kendi kodu, yardımcı nesnenin üyelerini bir önek olmadan kullanır. Burada her bilet, tüm biletlerin paylaştığı tek bir sayaçtan sıradaki numarayı alır:
class Ticket(val holder: String) {
val number = nextNumber++
companion object {
private var nextNumber = 1
val issued: Int
get() = nextNumber - 1
}
}main içinde:
val a = Ticket("Ada")
val b = Ticket("Bo")
println("${a.holder} #${a.number}, ${b.holder} #${b.number}")
println("issued: ${Ticket.issued}")Çıktı:
Ada #1, Bo #2
issued: 2Kotlin'de static anahtar sözcüğü yoktur. Companion'ın üyeleri bu rolü üstlenir: tüm sınıf için tek bir kopya vardır ve bu kopyaya ClassName.member olarak erişilir. Her nesne gibi companion da sınıf ilk kez kullanıldığında bir kez oluşturulur. Fabrikalar ve paylaşılan sayaçlar gibi tek bir örneğe bağlı olmayan şeyleri onun içine koyun; bir örneğin verilerini okuyan her şey ise normal bir üye olarak kalmalıdır.
class User private constructor(val name: String) {
fun greet() = "hi $name" // bir örnek gerektirir: user.greet()
companion object {
fun guest() = User("guest") // sınıfa aittir: User.guest()
}
}Görev
KolayCoupon sınıfını tamamla. Yapıcısı özeldir; bu nedenle kuponlar, companion object içindeki Coupon.create(code, percent) fabrikası tarafından oluşturulur. Kod 4 ila 10 karakter uzunluğunda büyük harflerden ve rakamlardan oluşmadıkça veya yüzde 1 ile 90 arasında olmadıkça null döndürür. Companion object ayrıca oluşturduğu kuponları created içinde sayar; dışarıdaki kod bu değeri okuyabilir ancak değiştiremez. apply(price), fiyatı indirim miktarı çıkarılmış ve aşağı yuvarlanmış olarak döndürür (price * (100 - percent) / 100).
Sağlanan kod, SAVE10 10 200 satırlarını (kod, yüzde, fiyat) okur. SAVE10: 180 veya invalid coupon SAVE10 yazdırır ve son olarak sayıyla birlikte created: yazdırır.
Kodun Coupon.kt dosyasına yazılmalıdır. Main.kt, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
fun main() {
// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
val input = generateSequence(::readLine).toList()
for (line in input) {
val (code, percent, price) = line.split(" ")
val coupon = Coupon.create(code, percent.toInt())
if (coupon == null) println("invalid coupon $code") else println("${coupon.code}: ${coupon.apply(price.toInt())}")
}
println("created: ${Coupon.created}")
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaBirincil Yapıcılarinit Blokları ve Doğrulamaİkincil YapıcılarTekrar - Kütüphane Kartı4Kalıtım
Açık Sınıflar ve Alt SınıflarÜyeleri Geçersiz Kılmasuper ve YapıcılarSoyut SınıflarTekrar - Personel Dizini2Özellikler ve Kapsülleme
Özel ErişimcilerGörünürlük DeğiştiricileriÖzel Setter'larlazy ve lateinitTekrar - Banka Hesabı5Arayüzler
Arayüz BildirimleriVarsayılan MetotlarBirden Çok ArayüzTür Olarak ArayüzlerÖzet - Ödeme Yöntemleri8Generic'ler
Generic FonksiyonlarGeneric SınıflarTür Kısıtlamalarıin ve out ile VaryansTekrar - Öncelik Kuyruğu11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Nesneler ve Eşlikçiler
Nesne BildirimleriEşlikçi Nesnelerconst ile SabitlerNesne İfadeleriTekrar - Bilet GişesiKendi başına pratik yap: Kotlin playground