سازنده ها در برنامه نویسی کاتلین
سازنده ها در برنامه نویسی کاتلین
در این درس از مجموعه آموزش های برنامه نویسی سایت سورس باران، در مورد سازنده ها در برنامه نویسی کاتلین (kotlin-constructors) (سازنده های اولیه و ثانویه) و همچنین بلوک های مقداردهنده اولیه برای شما خواهیم گفت.
سازنده یک روش مختصر و مفید برای مقداردهی مشخصههای کلاس است.
سازنده یک تابع عضو خاص است که وقتی یک شی ایجاد می شود (مقدار دهیمی شود) فراخوانی می شود. با این حال، نحوه کار آنها در برنامه نویسی کاتلین کمی متفاوت است.
در برنامه نویسی کاتلین، دو سازنده وجود دارد:
- سازنده اولیه – روش مختصر و مفید برای شروع کلاس
- سازنده ثانویه – به شما امکان تعریف منطق اضافی برای مقداردهی اولیه را فراهم می کند.
سازنده اولیه در برنامه نویسی کاتلین
سازنده اولیه بخشی از هدر کلاس است. مثالی در اینجا آورده شده است:
1 2 3 |
class Person(val firstName: String, var age: Int) { // class body } |
بلوک کدی که توسط پرانتز احاطه شده است سازنده اولیه است:
1 |
(val firstName: String, var age: Int) |
سازنده دو مشخصه را اعلان می کند: مشخصه firstName ( مشخصه فقط خواندنی که با استفاده از کلید واژه val اعلان می شود) و مشخصه age ( مشخصه خواندن-نوشتن همانطور که با کلید واژه var اعلان می شود).
مثال: سازنده اولیه در برنامه نویسی کاتلین
1 2 3 4 5 6 7 8 9 10 11 |
fun main(args: Array<String>) { val person1 = Person("Joe", 25) println("First Name = ${person1.firstName}") println("Age = ${person1.age}") } class Person(val firstName: String, var age: Int) { } |
خروجی به شکل زیر می باشد؛
1 2 |
First Name = Joe Age = 25 |
هنگامی که شی کلاس Person ایجاد می شود، مقدار “Joe” و 25 به گونه ای ارسال می شوند که گویی Person یک تابع است.
این کار مشخصه firstName و age را به ترتیب به “جو” و 25 مقدار دهی می کند.
روش های دیگری برای استفاده از سازنده های اولیه وجود دارد.
سازندۀ اولیه و بلوک مقداردهی اولیه
سازنده اولیه یک ساختار محدود دارد و نمی تواند حاوی کدی باشد.
برای قرار دادن کد مقداردهی اولیه (و نه فقط کدی که مشخصه ها را مقداردهی کند)، از بلوک مقداردهنده استفاده می شود. برای استفاده از این بلوک از کلید واژه init استفاده می شود. بیایید مثال بالا را با مقداردهی اولیه اصلاح کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
fun main(args: Array<String>) { val person1 = Person("joe", 25) } class Person(fName: String, personAge: Int) { val firstName: String var age: Int // initializer block init { firstName = fName.capitalize() age = personAge println("First Name = $firstName") println("Age = $age") } } |
خروجی به شکل زیر می باشد؛
1 2 |
First Name = Joe Age = 25 |
در اینجا، پارامترهای fName و personAge درون پرانتز هنگام ایجاد شی person1 به ترتیب مقادیر “Joe” و 25 را می پذیرند. با این حال، fName و personAge بدون استفاده از var یا val استفاده می شوند و از مشخصه های کلاس Person نیستند.
کلاس Person دو مشخصه firstName و age را اعلان می کند.
هنگامی که شی person1 ایجاد می شود، کد درون بلوک مقداردهنده اجرا می شود. بلوک مقداردهنده نه تنها مشخصه های خود را مقداردهی اولیه می کند بلکه آنها را پرینت می کند.
در اینجا روش دیگری برای انجام همان کار وجود دارد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
fun main(args: Array<String>) { val person1 = Person("joe", 25) } class Person(fName: String, personAge: Int) { val firstName = fName.capitalize() var age = personAge // initializer block init { println("First Name = $firstName") println("Age = $age") } } |
برای تشخیص پارامتر و ویژگی سازنده، از نامهای مختلفی استفاده می شود (fName و firstName، و personAge و age). معمولاً استفاده از _firstName و _age به جای نام کاملاً متفاوت برای پارامترهای سازنده معمول است. مثلا:
1 2 3 4 5 6 7 8 9 |
class Person(_firstName: String, _age: Int) { val firstName = _firstName.capitalize() var age = _age // initializer block init { ... .. ... } } |
مقدار پیش فرض در سازنده اولیه در کاتلین
می توانید مقدار پیش فرض پارامترهای سازنده را ارائه دهید (مشابه ارائه آرگومان های پیش فرض توابع). مثلا:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
fun main(args: Array<String>) { println("person1 is instantiated") val person1 = Person("joe", 25) println("person2 is instantiated") val person2 = Person("Jack") println("person3 is instantiated") val person3 = Person() } class Person(_firstName: String = "UNKNOWN", _age: Int = 0) { val firstName = _firstName.capitalize() var age = _age // initializer block init { println("First Name = $firstName") println("Age = $age\n") } } |
خروجی به شکل زیر می باشد؛
1 2 3 4 5 6 7 8 9 10 |
First Name = Joe Age = 25 person2 is instantiated First Name = Jack Age = 0 person3 is instantiated First Name = UNKNOWN Age = 0 |
سازنده ثانویه در برنامه نویسی کاتلین
در برنامه نویسی کاتلین، یک کلاس می تواند شامل یک یا چند سازنده ثانویه باشد. این سازنده ها با استفاده از کلید واژه constructor ایجاد می شوند.
سازنده های ثانویه در کاتلین معمول نیستند. متداول ترین کاربرد سازنده ثانویه زمانی به وجود می آید که شما نیاز به گسترش یک کلاس دارید که چندین سازنده را ارائه می دهد که کلاس را به روش های مختلف شروع می کنند.
در اینجا نحوه ایجاد سازنده ثانویه در برنامه نویسی کاتلین آورده شده است:
1 2 3 4 5 6 7 8 |
class Log { constructor(data: String) { // some code } constructor(data: String, numberOfData: Int) { // some code } } |
در اینجا، کلاس Log دارای دو سازنده ثانویه است، اما سازنده اولیه ندارد.
می توانید کلاس را به صورت زیر گسترش دهید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Log { constructor(data: String) { // code } constructor(data: String, numberOfData: Int) { // code } } class AuthLog: Log { constructor(data: String): super(data) { // code } constructor(data: String, numberOfData: Int): super(data, numberOfData) { // code } } |
در اینجا سازندگان کلاس مشتق شده AuthLog سازنده مربوط به کلاس پایه Log را فراخوانی می کنند. برای آن از super () استفاده می شود.
در کاتلین می توانید با استفاده از ()this سازنده دیگری از همان کلاس (مانند جاوا) را فراخوانی کنید.
1 2 3 4 5 6 7 8 |
class AuthLog: Log { constructor(data: String): this(data, 10) { // code } constructor(data: String, numberOfData: Int): super(data, numberOfData) { // code } } |
مثال: سازنده ثانویه در برنامه نویسی کاتلین
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 |
fun main(args: Array<String>) { val p1 = AuthLog("Bad Password") } open class Log { var data: String = "" var numberOfData = 0 constructor(_data: String) { } constructor(_data: String, _numberOfData: Int) { data = _data numberOfData = _numberOfData println("$data: $numberOfData times") } } class AuthLog: Log { constructor(_data: String): this("From AuthLog -> " + _data, 10) { } constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) { } } |
خروجی به شکل زیر می باشد؛
1 |
From AuthLog -> Bad Password: 10 times |
توجه: اگر کلاس سازنده ولیه ندارد، سازنده ثانویه باید کلاس پایه را مقداردهی اولیه کند یا سازنده دیگری را نمایندگی کند (مانند مثال بالا).
لیست جلسات قبل آموزش برنامه نویسی کاتلین
- معرفی کاتلین، Kotlin Hello World – اولین برنامه کاتلین
- انواع متغیرهای پایه در کاتلین
- عملگرهای برنامه نویسی کاتلین
- تبدیل نوع در برنامه نویسی کاتلین
- عبارت ها، گزاره ها و بلوک ها در برنامه نویسی کاتلین
- کامنت ها در برنامه نویسی کاتلین
- ورودی / خروجی پایه در برنامه نویسی کاتلین
- عبارت if در برنامه نویسی کاتلین
- عبارت when در برنامه نویسی کاتلین
- حلقه های while و do … while در برنامه نویسی کاتلین
- حلقه for در برنامه نویسی کاتلین
- عبارت break در برنامه نویسی کاتلین
- عبارت continue در برنامه نویسی کاتلین
- توابع در برنامه نویسی کاتلین
- فراخوانی تابع میانوندی در برنامه نویسی کاتلین
- آرگومان های پیش فرضآرگومان های پیش فرض و نام دار در برنامه نویسی کاتلین
- توابع بازگشتی در برنامه نویسی کاتلین
- کلاس و شی در برنامه نویسی کاتلین
دیدگاه شما