English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يمكننا فهم الوراثة كحصول فئة على طرق وأصابع الخصائص من فئة أخرى.
عندما ترث فئة أخرى، تُسمى الفئة المورثة فئة فرعية، والفئة المورثة تُسمى فئة رئيسية (أو فئة آباء)
في Swift، يمكن للفئة طلب وتحديد الوصول إلى طرق الفئة الرئيسية وأصابع الخصائص وأسطر العلامات، وكذلك تعديلها.
يمكننا أيضًا إضافة ملاحظات الخصائص إلى الخصائص الموروثة من الفئة.
الصف الذي لم يرث أي فئة آخر يُسمى فئة أساسية (Base Class).
في هذا المثال، قمنا بتعريف الفئة الأساسية StudDetails، التي توضح الطالب (stname) وأرقام النقاط لكل فصل دراسي (mark1، mark2، mark3):
class StudDetails { var stname: String! var mark1: Int! var mark2: Int! var mark3: Int! init(stname: String, mark1: Int, mark2: Int, mark3: Int) { self.stname = stname self.mark1 = mark1 self.mark2 = mark2 self.mark3 = mark3 } } let stname = "swift" let mark1 = 98 let mark2 = 89 let mark3 = 76 let sds = StudDetails(stname:stname, mark1:mark1, mark2:mark2, mark3:mark3); print(sds.stname) print(sds.mark1) print(sds.mark2) print(sds.mark3)
نتيجة تنفيذ البرنامج المذكور أعلاه هي:
swift 98 89 76
الفئة الفرعية تشير إلى إنشاء فئة جديدة بناءً على فئة موجودة مسبقًا.
لإيضاح أن الفئة الرئيسية لفئة معينة، يكتب اسم الفئة الرئيسية بعد اسم الفئة الفرعية، مسبوقًا بنقطة عائمة (:)، والتنسيق النصي كالتالي
class SomeClass: SomeSuperclass { // تعريف الفئة }
في هذا المثال، قمنا بتعريف الفئة الأصلية StudDetails، ثم استخدمنا الفئة الفرعية Tom لتوريثها:
class StudDetails { var mark1: Int; var mark2: Int; init(stm1: Int, results: Int) { mark1 = stm1; mark2 = stm2; } func show() { print("Mark1:\(self.mark1), Mark2:\(self.mark2)") } } class Tom: StudDetails { init() { super.init(stm1: 93, results: 89) } } let tom = Tom() tom.show()
نتيجة تنفيذ البرنامج المذكور أعلاه هي:
Mark1:93, Mark2:89
يمكن للفئة الفرعية الوصول إلى الطرق الموروثة، الطرق الفئوية، الخاصيات الموروثة، أو نص التجميع لتحقيق ميزات مخصصة الخاصة بها، ونحن نسمي هذا السلوك إعادة الكتابة (overriding).
يمكننا استخدام كلمة المفتاح override لتحقيق إعادة الكتابة.
يمكنك الوصول إلى طرق الفئة الأصلية، الخاصيات، ونص التجميع باستخدام بادئة super.
إعادة الكتابة | الوصول إلى الطريقة، الخاصية، ونص التجميع |
---|---|
الطريقة | super.somemethod() |
الخاصية | super.someProperty() |
نص التجميع | super[someIndex] |
في فئتنا الفرعية، يمكننا استخدام كلمة المفتاح override لإعادة كتابة طريقة الفئة الأصلية.
في هذا المثال، قمنا بإعادة كتابة طريقة show()
class SuperClass { func show() { print("هذا هو الفئة الأصلية SuperClass") } } class SubClass: SuperClass { override func show() { print("هذا هو الفئة الفرعية SubClass") } } let superClass = SuperClass() superClass.show() let subClass = SubClass() subClass.show()
نتيجة تنفيذ البرنامج المذكور أعلاه هي:
هذا هو الفئة الأصلية SuperClass هذا هو الفئة الفرعية SubClass
يمكنك تقديم getter مخصص (أو setter) لإعادة كتابة أي الخاصية الموروثة، سواء كانت الخاصية الموروثة من النوع المحفوظة أم الخاصية الحسابية.
لا تعلم الفئة الفرعية ما إذا كانت الخاصية التي ورثتها نوعية أو حسابية، بل تعلم فقط أن الخاصية التي ورثتها ستكون لها اسم ونوع. لذلك، يجب عليك كتابة الاسم والنوع عند تعديل الخاصية.
ملاحظة:
إذا قدمت setter في تعديل الخاصية، فعليك أيضًا تقديم getter.
إذا لم تكن ترغب في تعديل قيمة الخاصية التي ورثتها في نسخة التعديل، يمكنك إرجاع القيمة التي ورثتها مباشرة من خلال super.someProperty، حيث someProperty هو اسم الخاصية التي تريد تعديلها.
في هذا المثال، قمنا بتعريف الفئة الأصلية دائرة وفئة الفرعية مستطيل، في فئة مستطيل نعيد كتابة الخاصية area:
class دائرة { var radius = 12.5 النوع var area: String { return "مستطيل قطره \(radius) " } } // وراثة من الفئة الأصلية دائرة class Rectangle: Circle { var print = 7 override var area: String { return super.area + "،但现在被重写为 \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 اطبع("Radius \(rect.area)")
نتيجة تنفيذ البرنامج المذكور أعلاه هي:
Radius مستطيل قطره 25.0 ،但现在 تم تعديلها إلى 3
يمكنك إضافة ملاحظة الخاصية إلى الخاصية التي ورثتها في تعديل الخاصية. بهذه الطريقة، عندما تتغير قيمة الخاصية التي ورثتها، ستتمكن من مراقبتها.
ملاحظة:لا يمكنك إضافة ملاحظة الخاصية إلى الخاصية النوعية الثابتة أو الخاصية النوعية القابلة للقراءة التي ورثتها.
class دائرة { var radius = 12.5 النوع var area: String { return "مستطيل قطره \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + "،但现在被重写为 \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 اطبع("قطر: \(rect.area)") class مربع: مستطيل { override var radius: Double { didSet {}} print = Int(radius/5.0)+1 } } } let sq = Square() sq.radius = 100.0 print("القطر: \(sq.area)"}
قطر: مستطيل قطره 25.0 ،但现在 تم تعديلها إلى 3 قطر: مستطيل قطره 100.0 ،但现在 تم تعديلها إلى 21
يمكننا استخدام كلمة المفتاح final لحمايتها من التعديل.
إذا قمت بتعديل طريقة final، الخاصية أو السكريبت الخاص بالوصول، سيتم إصدار خطأ أثناء التجميع.
يمكنك إضافة خاصية final إلى كلمة المفتاح class (final class) لتمييز الكلase كـ final، مثل هذه الكلاسات غير قابلة للوراثة، وإلا سيتم إصدار خطأ في التجميع.
final class دائرة { النوع النهائي final var radius = 12.5 النوع var area: String { return "مستطيل قطره \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + "،但现在被重写为 \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 اطبع("قطر: \(rect.area)") class مربع: مستطيل { override var radius: Double { didSet {}} print = Int(radius/5.0)+1 } } } let sq = Square() sq.radius = 100.0 print("القطر: \(sq.area)"}
بسبب أن هذا المثال يستخدم كلمة المفتاح final لا يسمح بالكتابة فوقه، لذا سيكون هناك خطأ أثناء التنفيذ:
خطأ: var يتعدى النوع النهائي var override var area: String { ^ ملاحظة: التغيير الموروث هنا النوع var area: String { ^ خطأ: var يتعدى النوع النهائي var override var radius: Double { ^ ملاحظة: التغيير الموروث هنا النوع النهائي final var radius = 12.5 ^ خطأ: الوراثة من فئة قابلة للتعديل النهائية 'Circle' class Rectangle: Circle { ^