Alt sınıflar
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 22 / 57.
Kalıtım, bir sınıfın başka bir sınıf üzerine kurulmasını sağlar. class Dog: Animal, Dog sınıfını üst sınıf Animal'ın bir alt sınıfı yapar: bir köpek, bir hayvanın tüm özelliklerine ve metotlarına, ayrıca Dog'un eklediklerine sahiptir:
class Animal {
var name: String
init(name: String) { self.name = name }
func describe() -> String { "\(name) is an animal" }
}
class Dog: Animal {
func fetch() -> String { "\(name) fetches the ball" }
}
let rex = Dog(name: "Rex")
print(rex.describe())
print(rex.fetch())Çıktı:
Rex is an animal
Rex fetches the ballDepolanmış özellik eklemeyen bir alt sınıf, üst sınıf başlatıcılarını devralır; bu nedenle Dog(name:), Dog içinde bir init olmadan çalışır. Kalıtım bir is-a ilişkisini modeller: her köpek bir hayvandır; bu nedenle bir Dog, bir Animal beklenen her yerde kullanılabilir:
class Animal {
var name: String
init(name: String) { self.name = name }
}
class Cat: Animal {}
class Dog: Animal {}
let pets: [Animal] = [Cat(name: "Tom"), Dog(name: "Rex")]
for pet in pets { print(pet.name) }Çıktı:
Tom
RexYalnızca sınıflar kalıtımı destekler; struct'lar ve enum'lar kalıtım yapamaz. Bir sınıfın en fazla bir üst sınıfı olabilir, ancak bir üst sınıfın hiyerarşi oluşturan birçok alt sınıfı olabilir:
class Vehicle { var wheels = 0 }
class Car: Vehicle { } // Car bir Vehicle'dir
class Bike: Vehicle { } // Bike bir Vehicle'dir
// struct Truck: Vehicle { } // hata: struct'lar kalıtım alamazTüm alt sınıfların paylaştığı şeyleri üst sınıfa, yalnızca farklılıkları ise her bir alt sınıfa koy. Bir tür aslında diğer türün bir çeşidi değilse kalıtım yanlış araçtır; diğer türü tutan bir özellik çoğu zaman daha uygun olur.
class Shape {
var name: String
init(name: String) { self.name = name }
func label() -> String { "a \(name)" }
}
class Square: Shape {
var side = 1.0
func area() -> Double { side * side }
}
let s = Square(name: "square")
s.side = 3
print(s.label())
print(s.area())Çıktı:
a square
9.0Görev
KolayEmployee bir name ve salary saklar ve maaşı bir yüzde oranında (aşağı yuvarlanarak) artıran raise(by:) adlı bir yönteme sahiptir. reports adlı depolanmış bir özellik (başlangıçta boş olan bir isim dizisi), addReport(_:) adlı bir yöntem ve raporların sayısını döndüren teamSize() adlı bir yöntem ekleyen bir Manager alt sınıfı bildirin.
Sağlanan kod, ilk satırdan (name,salary) bir yönetici oluşturur, sonraki her adı bir rapor olarak ekler, %10 zam yapar ve Ada earns 5500 and leads 2 yazdırır.
Kodunuz Employee.swift ve Manager.swift dosyalarına gider. 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) }
let head = input[0].split(separator: ",").map(String.init)
let boss = Manager(name: head[0], salary: Int(head[1])!)
for name in input.dropFirst() { boss.addReport(name) }
boss.raise(by: 10)
print("\(boss.name) earns \(boss.salary) and leads \(boss.teamSize())")
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