Menu
Coddy logo textTech

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 false

Sı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
30

Bir 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 seats
challenge icon

Görev

Kolay

Product, 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())
}
quiz iconKendini test et

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

Kendi başına pratik yap: Swift playground