Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تجاوز الأساليب

جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 23 من 57.

يمكن للصنف الفرعي استبدال طريقة موروثة بإصداره الخاص. الكلمة المفتاحية override مطلوبة، مما يمنع استبدال طريقة عن طريق الخطأ:

class Animal {
    func sound() -> String { "..." }
}

class Dog: Animal {
    override func sound() -> String { "Woof" }
}

class Cat: Animal {
    override func sound() -> String { "Meow" }
}

print(Dog().sound())
print(Cat().sound())
print(Animal().sound())

الناتج:

Woof
Meow
...

تستدعي super.method() إصدار الصنف الأب من داخل التجاوز، مما يتيح للصنف الفرعي إضافة سلوك إلى السلوك الموروث بدلاً من استبداله بالكامل:

class Report {
    func text() -> String { "Sales: 120" }
}

class SignedReport: Report {
    override func text() -> String {
        super.text() + " (signed by Ada)"
    }
}

print(SignedReport().text())

الناتج:

Sales: 120 (signed by Ada)

يمكن أيضًا تجاوز الخصائص المحسوبة باستخدام override var:

class Shape {
    var sides: Int { 0 }
    var summary: String { "\(sides) sides" }
}

class Triangle: Shape {
    override var sides: Int { 3 }
}

print(Triangle().summary)

الناتج:

3 sides

يعمل التجاوز حتى عند استدعاء الطريقة من شفرة موروثة: فـ summary أعلاه مكتوبة في Shape، ومع ذلك فهي تستخدم sides الخاصة بـ Triangle. تستدعي Swift دائمًا إصدار الكائن الفعلي، وهذا ما يجعل التجاوز مفيدًا:

class Greeter {
    func name() -> String { "someone" }
    func greet() -> String { "Hello, \(name())" }
}

class AdaGreeter: Greeter {
    override func name() -> String { "Ada" }
}

let g: Greeter = AdaGreeter()
print(g.greet())

الناتج:

Hello, Ada
challenge icon

التحدي

سهل

يحتوي Notification على طريقة render() تُرجع [info] text. صرّح بالفئتين الفرعيتين Warning، التي تُرجع [warn] TEXT من خلال render() (مع جعل النص بأحرف كبيرة)، وReminder، التي تضيف قيمة minutes مخزّنة وتُرجع من خلال render() نتيجة الفئة الفائقة متبوعةً بـ (in 10 min)، باستخدام super.

يقرأ الكود المُزوَّد أسطرًا بالتنسيق info,text أو warn,text أو remind,text,10، وينشئ الكائن المناسب في مصفوفة من Notification، ثم يطبع render() لكل كائن.

ضع الكود الخاص بك في Notification.swift وWarning.swift وReminder.swift. يحتوي main.swift على كود الإدخال/الإخراج المُزوَّد ولا يمكن تعديله.

جرّب بنفسك

// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
var all: [Notification] = []
for line in input {
    let p = line.split(separator: ",").map(String.init)
    switch p[0] {
    case "warn": all.append(Warning(text: p[1]))
    case "remind":
        let r = Reminder(text: p[1])
        r.minutes = Int(p[2])!
        all.append(r)
    default: all.append(Notification(text: p[1]))
    }
}
for n in all { print(n.render()) }
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Swift