Polimorfizm
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 32 / 57.
Çok biçimlilik, bir kod parçasının birçok türdeki değerle çalışması ve her değerin kendi biçiminde tepki vermesi anlamına gelir. Aşağıdaki döngü, hangi hayvanı içerdiğini bilmeden sound() çağrısını yapar:
class Animal {
func sound() -> String { "..." }
}
class Dog: Animal {
override func sound() -> String { "Woof" }
}
class Cow: Animal {
override func sound() -> String { "Moo" }
}
let farm: [Animal] = [Dog(), Cow(), Dog()]
for a in farm { print(a.sound()) }Çıktı:
Woof
Moo
WoofSwift, hangi uygulamanın çalıştırılacağına çalışma zamanında, gerçek nesneye göre karar verir. Değişkenin bildirilmiş türü önemli değildir; önemli olan nesnenin türüdür:
class Animal {
func sound() -> String { "..." }
}
class Cat: Animal {
override func sound() -> String { "Meow" }
}
let pet: Animal = Cat()
print(pet.sound())Çıktı:
MeowProtokoller, struct ve enum türlerine aynı esnekliği sağlar. Burada bir işlev, herhangi bir Drawable değer listesini yazdırır:
protocol Drawable {
func draw() -> String
}
struct Line: Drawable {
let length: Int
func draw() -> String { String(repeating: "-", count: length) }
}
struct Box: Drawable {
func draw() -> String { "[ ]" }
}
func render(_ items: [any Drawable]) -> String {
items.map { $0.draw() }.joined(separator: " ")
}
print(render([Line(length: 3), Box(), Line(length: 1)]))Çıktı:
--- [ ] -Polimorfizm, varlık türleri üzerinde uzayan if/switch zincirlerinin yerini alır. Bir değerin ne olduğunu sorup sonra ne yapılacağına karar vermek yerine, değerden bunu yapmasını istersiniz. Yeni bir tür eklemek, her switch ifadesini düzenlemek yerine yeni bir tür eklemek anlamına gelir:
// polimorfizm olmadan
if kind == "dog" { print("Woof") } else if kind == "cow" { print("Moo") }
// polimorfizm ile
for animal in farm { print(animal.sound()) }Görev
KolayAnimal, name, legs() (4) ve describe() özelliklerine sahiptir; describe(), legs() ve sound() kullanılarak oluşturulan Rex has 4 legs and says Woof değerini döndürür. Yalnızca legs() ve sound() işlevlerini geçersiz kılarak Dog (ses Woof), Bird (2 bacak, ses Tweet) ve Snake (0 bacak, ses Hiss) tanımlayın.
Sağlanan kod, dog,Rex, bird,Pip veya snake,Kaa satırlarını okur, hayvanları tek bir [Animal] dizisinde saklar ve her biri için describe() çıktısını yazdırır.
Kodunuz Animal.swift, Dog.swift, Bird.swift ve Snake.swift dosyalarına yerleştirilmelidir. 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) }
var zoo: [Animal] = []
for line in input {
let p = line.split(separator: ",").map(String.init)
switch p[0] {
case "dog": zoo.append(Dog(name: p[1]))
case "bird": zoo.append(Bird(name: p[1]))
default: zoo.append(Snake(name: p[1]))
}
}
for a in zoo { print(a.describe()) }
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