Swift'te kalıtım, nesne yönelimli programlamanın temel ilkelerinden biridir ve Objective-C ve C++ gibi geleneksel OOP dillerinden gelmektedir. Ancak Swift, bu mekanizmayı önemli ölçüde kısıtlayarak ve basitleştirerek, tür güvenliği ve kodun öngörülebilirliği konularına vurgu yapmaktadır.
C++ ve Objective-C gibi erken OOP dillerinde kalıtım, kodun yeniden kullanılmasını ve sınıf hiyerarşilerinin oluşturulmasını sağlamak için kullanılıyordu. Swift bu mekanizmayı kasıtlı olarak kısıtlamıştır, böylece çoklu kalıtım sorunlarından ve karmaşık hiyerarşilerden kaçınılmaktadır.
Klasik kalıtım uygulamaları bir dizi probleme maruz kalmaktadır: ebeveyn sınıfları aracılığıyla işlevselliğin örtük bir şekilde eklenmesi, kodun bakımını ve test edilmesini zorlaştırması ve çoklu kalıtımda görülen diamond problem (elmas problemi). Swift'te bu sorunlar, sınıfların çoklu kalıtımının yasaklanması ile kısmen çözülmektedir.
Swift'te yalnızca tekil sınıf kalıtımına izin verilmektedir. Bu, bir sınıfın yalnızca bir ebeveyn sınıftan kalıtım alabileceği anlamına gelir. Davranışın birleştirilmesi için protokollerin ve bunların genişletmelerinin kullanılması önerilmektedir.
Basit kalıtım örneği:
class Animal { func speak() { print("Bazı sesler") } } class Dog: Animal { override func speak() { print("Hav hav!") } } let animal: Animal = Dog() animal.speak() // "Hav hav!"
Anahtar özellikler:
super özelliklerinin override edilmesiyle uygulanmaktadırSwift'te let ile tanımlanmış bir özelliği alt sınıfta geçersiz kılabilir miyiz?
Hayır. let ile tanımlanan özellikler geçersiz kılınamaz, bunlar sabitlerdir. Geçersiz kılma imkanı için override modifikatörü ile var özelliğini kullanın.
Swift'te yapılar veya enum'lar herhangi bir davranışı miras alır mı?
Hayır, yalnızca sınıflar birbirinden miras alabilir. Yapılar (struct) ve enum'lar mirası desteklememekte, ancak protokolleri uygulayabilmektedirler.
Miras alınamayan bir sınıf oluşturmak mümkün müdür?
Evet, sınıfın tanımından önce final modifikatörünü kullanın. Örnek:
final class Cat { func meow() { print("Miyav!") } } // class Siamese: Cat {} // Derleme hatası
Bir geliştirici hayvanlar için derin bir sınıf hiyerarşisi oluşturdu: Animal -> Mammal -> Carnivore -> Dog -> Bulldog. Her sınıf yeni özellikler veya yöntemler ekler.
Artılar: Mantık varlıklar arasına ayrılmış.
Eksiler: Hiyerarşinin davranışını değiştirmek zor. Yeni bir hayvan türü eklemek, birden fazla temel sınıfı değiştirmeyi gerektirir ve hata riski artırır.
Hayvanlar arasındaki farklılıklar için protokoller (örneğin, Sitter, Hunter) kullanılır. Her sınıf gerektiği protokolleri uygular, çok katmanlı bir hiyerarşi üzerinden miras almaz.
Artılar: Davranışın bileşimi daha esnek, yeni hayvan türleri eklemek orijinal kodu değiştirmeden kolay.
Eksiler: Protokol odaklı programlamayı daha iyi anlamayı gerektirir, başlangıçta daha zordur.