Sobes.tech
Middle

Soyut sınıflar söz konusu olduğunda protokoller ve sınıflar arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Protokol, bir sözleşmeyi tanımlar: Bu protokole uygun olan bir türün uygulaması gereken gereksinimler (yöntemler, özellikler, başlatıcılar) kümesidir. Protokoller, çoğu gereksiniminin uygulamasını içermez. Bir protokolün örneği oluşturulamaz.

Swift dışındaki dillerde (örneğin Java) soyut sınıf, doğrudan örneği oluşturulamayan bir sınıfı temsil eder. Hem uygulanmış yöntemler (veya özellikler) hem de alt sınıflarda uygulanması gereken soyut yöntemler içerir.

Swift'te geleneksel anlamda soyut sınıf kavramı yoktur. Swift'teki soyut sınıf işlevselliği, protokoller ve sınıfların kombinasyonu ile elde edilir.

Bir protokol kullanarak, bir arayüz tanımlanabilir ve ardından bu protokole uygun ve bir uygulama sağlayan normal bir sınıf oluşturulabilir. Bir protokolün kısmi uygulaması, genişletmeler (protocol extensions) aracılığıyla sağlanabilir, ancak bu, protokolü saf haliyle "soyut sınıf" yapmaz.

Protokol (Swift) Soyut Sınıf (geleneksel)
Amacı Bir sözleşme (arayüz) tanımlamak Ortak davranış ve yapıyı tanımlamak, kısmi uygulama ile birlikte
Uygulama Genellikle, uygulama içermez (dış genişletmeler hariç) Hem uygulanmış hem de soyut yöntemler içerebilir
Örnekleme Protokol örneği oluşturulamaz Doğrudan soyut sınıf örneği oluşturulamaz
Miras Protokol ile uyum (conformance) Miras (inheritance)
Çoklu kalıtım Tür, birden fazla protokole uygun olabilir Bir sınıf yalnızca bir sınıftan kalıtım alabilir (çoğu dilde)
Swift'te En temel soyutlama biçimidir Doğrudan karşılığı yoktur, protokoller ve sınıflar ile taklit edilir

Swift'te soyut sınıf taklidi için örnek:

Soyut gereksinimleri tanımlayan protokol:

// Sözleşme olarak protokol
protocol Drawable {
    func draw()
    var color: String { get set }
}

Protokole uygun ve uygulama sağlayan sınıf:

// Protokolü uygulayan sınıf
class Circle: Drawable {
    var color: String

    init(color: String) {
        self.color = color
    }

    func draw() {
        print("Renk \(color) olan bir daire çiziliyor")
    }
}

Varsayılan kısmi uygulama sağlamak için genişletme:

// Varsayılan uygulama sağlamak için genişletme (protokolü soyut sınıf yapmaz)
extension Drawable {
    func draw() {
        print("Renk \(color) ile bir şeyler çizmeye başlıyoruz")
    }
}

Bu şekilde, Swift'te protokoller, çok biçimlilik ve soyutlama sağlama konusunda temel rol oynar ve diğer dillerdeki soyut sınıf kavramını yerine geçer.