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.