تجاوز الأساليب
جزء من قسم البرمجة كائنية التوجه في رحلة 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التحدي
سهليحتوي 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()) }
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكال5الوراثة
الفئات الفرعيةتجاوز الأساليبالتهيئة وsuperfinal والتسلسلات الهرميةمراجعة - التسلسل الهرمي للموظفينتدرّب بنفسك: Playground لـ Swift