Başlatıcılar ve super
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 24 / 57.
Bir alt sınıf, varsayılan değeri olmayan depolanmış bir özellik eklediğinde kendi başlatıcısına ihtiyaç duyar. Önce kendi özelliklerini ayarlar, ardından super.init(...) ile üst sınıf başlatıcısını çağırır:
class Animal {
let name: String
init(name: String) { self.name = name }
}
class Bird: Animal {
let canFly: Bool
init(name: String, canFly: Bool) {
self.canFly = canFly
super.init(name: name)
}
}
let p = Bird(name: "Pip", canFly: false)
print("\(p.name) \(p.canFly)")Çıktı:
Pip falseSıra önemlidir: alt sınıf özellikleri super.init çalışmadan önce değerlere sahip olmalı ve miras alınan özellikler yalnızca bundan sonra kullanılabilir. Swift bunu derleme zamanında kontrol eder:
init(name: String, canFly: Bool) {
// print(self.name) // hata: self, super.init'ten önce kullanıldı
self.canFly = canFly // 1. kendi özellikleri
super.init(name: name) // 2. üst sınıf
print(self.name) // 3. artık her şey kullanılabilir
}Bir alt sınıf kendi başlatıcısını tanımladığında, artık üst sınıfın başlatıcılarını devralmaz. Bir alt sınıf, aynı parametrelere sahip bir başlatıcıyı override init olarak işaretleyerek de geçersiz kılabilir:
class Timer {
var seconds: Int
init(seconds: Int) { self.seconds = seconds }
}
class SafeTimer: Timer {
override init(seconds: Int) {
super.init(seconds: max(0, seconds))
}
}
print(SafeTimer(seconds: -5).seconds)
print(SafeTimer(seconds: 30).seconds)Çıktı:
0
30Bir hiyerarşinin her düzeyi kendi bölümünü başlatır ve geri kalanını üst sınıfına devreder; böylece zincirdeki her özellik tam olarak bir kez değer alır:
class Vehicle {
let wheels: Int
init(wheels: Int) { self.wheels = wheels }
}
class Car: Vehicle {
let seats: Int
init(seats: Int) {
self.seats = seats
super.init(wheels: 4)
}
}
class Taxi: Car {
let company: String
init(company: String) {
self.company = company
super.init(seats: 5)
}
}
let t = Taxi(company: "City Cabs")
print("\(t.company): \(t.wheels) wheels, \(t.seats) seats")Çıktı:
City Cabs: 4 wheels, 5 seatsGörev
KolayProduct, name ve price değerlerini (sent cinsinden) saklar. Saklanan bir percent değeriyle DiscountedProduct alt sınıfını tanımlayın. Başlatıcısı name, price ve percent değerlerini almalı, percent değerini saklamalı ve yüzde oranı kadar önceden azaltılmış (aşağı yuvarlanmış) fiyatla super.init çağrısı yapmalıdır. 0-100 aralığı dışındaki bir percent değeri 0 olarak kabul edilir. DiscountedProduct içinde, tea: 450 (10% off) döndüren bir label() metodu ekleyin.
Sağlanan kod, name,price,percent satırlarını okur, her biri için bir DiscountedProduct oluşturur ve label() çıktısını yazdırır.
Kodunuz Product.swift ve DiscountedProduct.swift dosyalarına yazılmalıdır. main.swift, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
let p = line.split(separator: ",").map { String($0) }
let item = DiscountedProduct(name: p[0], price: Int(p[1])!, percent: Int(p[2])!)
print(item.label())
}
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ımlamaMetotlar ve selfBaşlatıcılarSınıflar ReferanstırTekrar - Kütüphane Kartı4Kapsülleme
Erişim DenetimiDışarıdan Salt OkunurDurumu KorumaBaşarısız Olabilen BaşlatıcılarTekrar - Banka Hesabı7Polimorfizm ve Generic'ler
PolimorfizmTür DönüşümüGeneric FonksiyonlarGeneric TürlerTekrar - Şekil Hesaplayıcı2Struct Yapıları ve Değer Türleri
Struct YapılarıDeğer SemantiğiDeğiştirici MetotlarStruct mı Class mıTekrar - Envanter Öğesi5Kalıtım
Alt sınıflarMetotları Geçersiz KılmaBaşlatıcılar ve superfinal ve HiyerarşilerTekrar - Çalışan Hiyerarşisi11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Swift playground