Menu
Coddy logo textTech

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 ball

Depolanmış ö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
Rex

Yalnı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 alamaz

Tü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.0
challenge icon

Görev

Kolay

Employee 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())")
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