Metotları Geçersiz Kılma
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 23 / 57.
Bir alt sınıf, miras aldığı bir yöntemi kendi sürümüyle değiştirebilir. Yanlışlıkla bir yöntemi değiştirmeyi önlemek için override anahtar sözcüğü gereklidir:
class Animal {
func sound() -> String { "..." }
}
class Dog: Animal {
override func sound() -> String { "Woof" }
}
class Cat: Animal {
override func sound() -> String { "Meow" }
}
print(Dog().sound())
print(Cat().sound())
print(Animal().sound())Çıktı:
Woof
Meow
...super.method(), override içinden üst sınıf sürümünü çağırır; böylece alt sınıf, miras alınan davranışın tamamını değiştirmek yerine ona ekleme yapabilir:
class Report {
func text() -> String { "Sales: 120" }
}
class SignedReport: Report {
override func text() -> String {
super.text() + " (signed by Ada)"
}
}
print(SignedReport().text())Çıktı:
Sales: 120 (signed by Ada)Hesaplanan özellikler de override var ile geçersiz kılınabilir:
class Shape {
var sides: Int { 0 }
var summary: String { "\(sides) sides" }
}
class Triangle: Shape {
override var sides: Int { 3 }
}
print(Triangle().summary)Çıktı:
3 sidesGeçersiz kılma, yöntem miras alınan koddan çağrıldığında bile çalışır: Yukarıdaki summary, Shape içinde yazılmıştır, ancak Triangle'ın sides özelliğini kullanır. Swift her zaman gerçek nesnenin sürümünü çağırır; geçersiz kılmayı kullanışlı kılan da budur:
class Greeter {
func name() -> String { "someone" }
func greet() -> String { "Hello, \(name())" }
}
class AdaGreeter: Greeter {
override func name() -> String { "Ada" }
}
let g: Greeter = AdaGreeter()
print(g.greet())Çıktı:
Hello, AdaGörev
KolayNotification sınıfının [info] text döndüren bir render() metodu vardır. render() metodu [warn] TEXT döndüren (metni büyük harflerle yazan) Warning alt sınıfını ve saklanan bir minutes ekleyen, render() metodu üst sınıfın sonucunun ardından (in 10 min) döndüren Reminder alt sınıfını tanımlayın; bunun için super kullanın.
Verilen kod info,text, warn,text veya remind,text,10 satırlarını okur, Notification dizisi içinde uygun nesneyi oluşturur ve her biri için render() çıktısını yazdırır.
Kodunuz Notification.swift, Warning.swift ve Reminder.swift dosyalarına yazılmalıdır. main.swift verilen 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) }
var all: [Notification] = []
for line in input {
let p = line.split(separator: ",").map(String.init)
switch p[0] {
case "warn": all.append(Warning(text: p[1]))
case "remind":
let r = Reminder(text: p[1])
r.minutes = Int(p[2])!
all.append(r)
default: all.append(Notification(text: p[1]))
}
}
for n in all { print(n.render()) }
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