Menu
Coddy logo textTech

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
Woof

Swift, 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ı:

Meow

Protokoller, 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()) }
challenge icon

Görev

Kolay

Animal, 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()) }
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