با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش Swift را دنبال می کنند. در مبحث شیء گرایی در تمام زبان های برنامه نویسی چند ویژگی اصلی و مهم در هنگام ایجاد و تعریف کلاس ها در دسترس قرار می گیرد که یکی از این ویژگی های اصلی وراثت است. وراثت اجازه می دهد تا یک کلاس ویژگی ها و خصوصیات کلاس دیگر را به ارث برده و از آن ها استفاده کند. به این ترتیب شما می توانید بدون تکرار کدها و افزایش حجم برنامه ، از یک سری خصوصیات و ویژگی ها در چندین کلاس دیگر در برنامه ی خود بهره ببرید. ویژگی وراثت در Swift نیز ارائه شده و در تعریف کلاس ها قابل استفاده می باشد. در ادامه ی این مبحث ما شما را با کلیات و توضیحات کار با وراثت در Swift آشنا خواهیم کرد.
در این آموزش شما با سینتکس اصلی کلاس ها و کار با ویژگی وراثت در Swift آشنا خواهید شد.
به طور کلی کلاس ها به دو نوع ابر کلاس و زیر کلاس ها تقسیم می شوند:
یک کلاس که متدها، خواص یا توابع را از کلاس دیگری به ارث نمی برد، به عنوان «کلاس پایه» نامیده می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 4" let mark1 = 98 let mark2 = 89 let mark3 = 76 print(stname) print(mark1) print(mark2) print(mark3) |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 2 3 4 | Swift 4 98 89 76 |
در مثال فوق یک کلاس با نام StudDetails تعریف شده است که برای نام دانش آموزان تعریف شده است.
همچنین در کلاس فوق سه موضوع به عنوان mark1، mark2 و mark3 علامت گذاری می شوند.
برای مقدار دهی اولیه در کلاس پایه از کلمه کلیدی ‘let’ استفاد می شود.
از تابع ‘print’ نیز برای نمایش نتایج در خروجی استفاده می شود.
عمل ایجاد یک کلاس جدید در یک کلاس موجود، به عنوان “Subclass” تعریف شده است.
زیر کلاس خواص، متد ها و توابع کلاس پایه را به ارث می برد. برای تعریف زیر کلاس از ‘:’ قبل از نام کلاس پایه استفاده می شود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class StudDetails { var mark1: Int; var mark2: Int; init(stm1:Int, results stm2:Int) { mark1 = stm1; mark2 = stm2; } func print() { print("Mark1:\(mark1), Mark2:\(mark2)") } } class display : StudDetails { init() { super.init(stm1: 93, results: 89) } } let marksobtained = display() marksobtained.print() |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 | Mark1:93, Mark2:89 |
کلاس StudDetails در واقع به عنوان یک ابر کلاس شناخته می شود.
و ‘display’ نیز به عنوان یک زیر کلاس از خواص و متدهای StudDetails برای محاسبه پارامترهای ورودی خود استفاده می کند.
دسترسی به ابر کلاس ها، متدهای نمونه ، خصوصیات و زیر کلاس ها با مفهوم “overriding” شناخته می شود.
از کلید واژه ی ‘override’ برای اعمال متدهای تعریف شده در ابر کلاس ها استفاده می شود.
از کلید واژه ی ‘super’ به عنوان پیشوندی برای متدها ، خصوصیات و زیر کلاس های تعریف شده در ابر کلاس استفاده می شود:
Overriding | دسترسی به متد ، خصوصیات و زیر کلاس |
Methods | ()super.somemethod |
Properties | ()super.someProperty |
Subscripts | [super[someIndex |
متدهای نمونه و وراثتی می توانند توسط کلمه کلیدی ‘override’ به متدهای تعریف شده در زیر کلاس اعمال شوند.
در مثال زیر متد ()print به زیر کلاس تعریف شده اعمال می شود تا به خصوصیات آن دسترسی داشته باشد.
همچنین یک نمونه جدید از ابر کلاس ()cricket با عنوان ‘cricinstance’ تعریف شده است.
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class cricket { func print() { print("Welcome to Swift 4 Super Class") } } class tennis: cricket { override func print() { print("Welcome to Swift 4 Sub Class") } } let cricinstance = cricket() cricinstance.print() let tennisinstance = tennis() tennisinstance.print() |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 2 | Welcome to Swift Super Class Welcome to Swift Sub Class |
شما می توانید یک خصوصیت وراثتی و یا یکی از خصوصیات اعلام شده در کلاس را در زیر کلاس ها اعمال کنید.
Swift 4 به کاربر اجازه می دهد تا خصوصیات سفارشی تنظیم کنندگان و دریافت کنندگان را به یک ویژگی وراثتی که یک خصوصیت ذخیره شده یا محاسبه شده است اعمال کند.
نام و نوع خصوصیات وراثتی در زیر کلاس مشخص نیست، بنابراین باید این موارد را در ابر کلاس مشخص کنید.
این کار به دو روش انجام می شود:
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Circle { var radius = 12.5 var area: String { return "of rectangle for \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + " is now overridden as \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 print("Radius \(rect.area)") |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 | Radius of rectangle for 25.0 is now overridden as 3 |
زمینکه یک خصوصیت جدید نیاز به اضافه شدن برای یک خصوصیت وراثتی دارد، مفهوم ‘property overriding’ در Swift 4 معرفی شد.
این مفهوم زمانیکه مقدار خصوصیت وراثتی تغیر کند کاربر را مطلع می سازد.
اما overriding برای خصوصیات ثابت وراثتی ذخیره شده و خصوصیات حاسبه شده فقط خواندنی قابل اجرا نیست.
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | class Circle { var radius = 12.5 var area: String { return "of rectangle for \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + " is now overridden as \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 print("Radius \(rect.area)") class Square: Rectangle { override var radius: Double { didSet { print = Int(radius/5.0)+1 } } } let sq = Square() sq.radius = 100.0 print("Radius \(sq.area)") |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 2 | Radius of rectangle for 25.0 is now overridden as 3 Radius of rectangle for 100.0 is now overridden as 21 |
زمانیکه کاربر نمی خواهد دیگران به متدها ، خصوصیات و زیر کلاس های ابر کلاس دسترسی داشته باشند، Swift 4 ویژگی ‘final’ را معرفی می کند.
زمانیکه ویژگی ‘final’ تعریف شود، زیر مجموعه ها اجازه نمی دهند متدها خصوصیات و زیر مجموعه های ابر کلاس اعمال (استفاده) شوند.
زمانیکه خصوصیت ‘final’ اعلام می شود کاربر برای ایجاد زیز کلاس ها محدودیت خواهد داشت.
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | final class Circle { final var radius = 12.5 var area: String { return "of rectangle for \(radius) " } } class Rectangle: Circle { var print = 7 override var area: String { return super.area + " is now overridden as \(print)" } } let rect = Rectangle() rect.radius = 25.0 rect.print = 3 print("Radius \(rect.area)") class Square: Rectangle { override var radius: Double { didSet { print = Int(radius/5.0)+1 } } } let sq = Square() sq.radius = 100.0 print("Radius \(sq.area)") |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <stdin>:14:18: error: var overrides a 'final' var override var area: String { ^ <stdin>:7:9: note: overridden declaration is here var area: String { ^ <stdin>:12:11: error: inheritance from a final class 'Circle' class Rectangle: Circle { ^ <stdin>:25:14: error: var overrides a 'final' var override var radius: Double { ^ <stdin>:6:14: note: overridden declaration is here final var radius = 12.5 |
زمانیکه ابر کلاس و انواع داده های آن به عنوان ‘final’ معرفی شوند برنامه اجازه نمی دهد که زیر کلاس های دیگری تعریف شوند.
وراثت یکی از مهم ترین و پرکاربردترین ویژگی های کلاس ها و مبحث شیء گرایی در زبان های برنامه نویسی و است که از تکرار یک سری دستورات و خصوصیات از سایر کلاس ها در جایی که نیاز داریم جلوگیری می کند، از این رو مباحث این بخش را به آشنایی با چگونگی کار با وراثت در Swift اختصاص دادیم.