کلاس

کلاس به شما اجازه می‌دهد یک نوع داده‌ای که توسط کاربر تعریف می‌شود و شامل فیلدها و خواص (properties) و توابع است را ایجاد کنید. کلاس در حکم یک نقشه برای یک شیء می‌باشد.

شیء یک چیز واقعی است که از ساختار، خواص و یا رفتارهای کلاس پیروی می‌کند. وقتی یک شیء می‌سازید یعنی اینکه یک نمونه از کلاس ساخته‌اید (در درس ممکن است از کلمات شیء و نمونه به جای هم استفاده شود).

اگر یادتان باشد در بخشهای اولیه این آموزش کلاسی به نام MyFirstProgram تعریف کردیم که شامل تابع main() بود و ذکر شد که این تابع نقطه آغاز هر برنامه است. برای تعریف یک کلاس از کلمه کلیدی class به صورت زیر استفاده می‌شود :

class ClassName
{
    field1;
    field2;
    ...
    fieldN;

    method1;
    method2;
    ...
    methodN;  
}

این کلمه کلیدی را قبل از نامی که برای کلاسمان انتخاب می‌کنیم می‌نویسیم. در نامگذاری کلاس‌ها هم از روش نامگذاری Pascal استفاده می‌کنیم. در بدنه کلاس فیلدها و تابعهای آن قرار داده می‌شوند. فیلدها اعضای داده‌ای خصوصی هستند که کلاس از آنها برای رفتارها و ذخیره مقادیر خاصیت‌هایش (property) استفاده می‌کند. تابعها رفتارها یا کارهایی هستند که یک کلاس می‌تواند انجام دهد. در زیر نحوه تعریف و استفاده از یک کلاس ساده به نام person نشان داده شده است.

  1: class Person
  2: {
  3:     var name: String = ""
  4:     var age: Int = 0
  5:     var height: Double = 0.toDouble()
  6: 
  7:     fun tellInformation()
  8:     {
  9:         println("Name: $name")
 10:         println("Age: $age years old")
 11:         println("Height: $height cm")
 12:     }
 13: }
 14: 
 15: fun main(args: Array<String>)
 16: {
 17:     val firstPerson = Person()
 18:     val secondPerson = Person()
 19: 
 20:     firstPerson.name = "Jack"
 21:     firstPerson.age = 21
 22:     firstPerson.height = 160.0
 23:     firstPerson.tellInformation()
 24: 
 25:     println() //Separator
 26: 
 27:     secondPerson.name = "Mike"
 28:     secondPerson.age = 23
 29:     secondPerson.height = 158.0
 30:     secondPerson.tellInformation()
 31: }
Name: Jack
Age: 21 years old
Height: 160cm

Name: Mike
Age: 23 years old
Height: 158cm

برنامه بالا شامل دو کلاس Person (خطوط 13-1) و MyFirstProgram (خطوط 31-15) می‌باشد. می دانیم که کلاس MyFirstProgram شامل تابع main() است که برنامه برای اجرا به آن احتیاج دارد ولی اجازه دهید که بر روی کلاس Person تمرکز کنیم. در خطوط 14-1 کلاس Person تعریف شده است. در خط 1 یک نام به کلاس اختصاص داده‌ایم تا به وسیله آن قابل دسترسی باشد. در داخل بدنه کلاس، فیلدهای آن تعریف شده‌اند (خطوط 5-3).

این سه فیلد تعریف شده خصوصیات واقعی یک فرد در دنیای واقعی را در خود ذخیره می‌کنند. یک فرد در دنیای واقعی دارای نام، سن، و قد می‌باشد. در خطوط 12-7 یک تابع هم در داخل کلاس به نام tellInformation() تعریف شده است که رفتار کلاسمان است و مثلاً اگر از فرد سوالی بپرسیم در مورد خودش چیزهایی می‌گوید. در داخل تابع کدهایی برای نشان دادن مقادیر موجود در فیلدها نوشته شده است. نکته‌ای درباره فیلدها وجود دارد و این است که چون فیلدها در داخل کلاس تعریف و به عنوان اعضای کلاس در نظر گرفته شده‌اند محدوده آنها یک کلاس است.

این بدین معناست که فیلدها فقط می‌توانند در داخل کلاس یعنی جایی که به آن تعلق دارند و یا به وسیله نمونه ایجاد شده از کلاس مورد استفاده قرار بگیرند. در داخل تابع main() و در خطوط 17 و 18 دو نمونه یا دو شیء از کلاس Person ایجاد می‌کنیم. برای ایجاد یک نمونه از یک کلاس ابتدا یک متغیر تغریف کرده و به دنبال آن بعد از علامت مساوی، نام کلاس و یک جفت پرانتز قرار دهیم. وقتی نمونه کلاس ایجاد شد، سازنده را صدا می‌زنیم. یک سازنده تابع خاصی است که برای مقداردهی اولیه به فیلدهای یک شیء به کار می‌رود. وقتی هیچ آرگومانی در داخل پرانتزها قرار ندهید، کلاس یک سازنده پیشفرض بدون پارامتر را فراخوانی می‌کند. درباره سازنده‌ها در درس‌های آینده توضیح خواهیم داد.

در خطوط 23-20 مقادیری به فیلدهای اولین شیء ایجاد شده از کلاس Person (first Person) اختصاص داده شده است. برای دسترسی به فیلدها یا توابع یک شیء از علامت نقطه (دات) استفاده می‌شود. به عنوان مثال کد firstPerson.name نشان دهنده فیلد name از شیء firstPerson می‌باشد. برای چاپ مقادیر فیلدها باید تابع tellInformation() شیء firstPerson را فراخوانی می‌کنیم.

در خطوط 30-27 نیز مقادیری به شیء دومی که قبلاً از کلاس ایجاد شده تخصیص می‌دهیم و سپس تابع tellInformation() را فراخوانی می‌کنیم. به این نکته توجه کنید که firstPerson و secondPerson نسخه‌های متفاوتی از هر فیلد دارند بنابراین تعیین یک نام برای secondPerson هیچ تاثیری بر نام firstPerson ندارد. در مورد اعضای کلاس در درسهای آینده توضیح خواهیم داد.