کلاسهای انتزاعی (Abstract Class)

کلاسهای مجرد (abstract) کلاس‌هایی هستند که کلاس پایه سایر کلاسها هستند. این نوع کلاس‌ها می‌توانند مانند کلاسهای عادی دارای سازنده باشند. شما نمی‌توانید از کلاسهای انتزاعی نمونه ایجاد کنید چون که هدف اصلی از به کار بردن کلاسهای انتزاعی استفاده از آنها به عنوان کلاس پایه برای کلاسهای مشتق است. برای تعریف یک کلاس انتزاعی از کلمه کلیدی abstract استفاده می‌شود. به مثال زیر در مورد استفاده از کلاسهای انتزاعی توجه کنید :

  1: abstract class Base(name: String)
  2: {
  3:     init
  4:     {
  5:         println("My name is $name.")
  6:     }
  7: 
  8:     abstract fun showMessage()
  9: }
 10: 
 11: class Derived(name: String) : Base(name)
 12: {
 13:     override fun showMessage()
 14:     {
 15:         println("I am a teacher.")
 16:     }
 17: }
 18: fun main(args: Array<String>)
 19: {
 20:     val derived = Derived("John")
 21: 
 22:     derived.showMessage()
 23: }
My name is John.
I am a teacher.

در داخل کلاس انتزاعی یک فیلد تعریف کرده (خط 1) و آن را توسط سازنده کلاس مقداردهی می‌کنیم. یک متد را هم به صورت انتزاعی (abstract) تعریف کرده‌ایم (خط 8). به این نکته توجه کنید که برای تعریف این متد کلمه کلیدی abstract را به کار برده‌ایم.

این متد باید به وسیله کلاسهایی که از این کلاس ارث می‌برند override یا به صورت دیگر پیاده سازی شود، ولی از آن جاییکه به صورت abstract تعریف شده است، فاقد بدنه می‌باشد. می‌بینید که کلاسهای abstract می‌توانند شامل property های معمولی مانند property، name مثال بالا باشند. کلاسهای abstract حداقل باید یک عضو abstract داشته باشند.

یک کلاس دیگر تعریف می‌کنید که از کلاس Base ارث بری کند. سپس در خطوط 16-13 متد abstract را به صورت دیگر پیاده سازی می‌کنیم (override کنیم). همانطور که در درس‌های قبل ذکر شد، وقتی یک کلاس از کلاس دیگری ارث بری می‌کند باید بعد از علامت دو نقطه و نام کلاس کلاس پایه، پارامترهای کلاس پایه هم ذکر شوند. کاری که ما در خط 11 انجام داده‌ایم. حال در خط 20 یک نمونه از کلاس فرزند، ایجاد، و بعد از ارسال آرگومان‌های مورد نیاز در خط 20، متد ()showMessage را فراخوانی می‌کنیم (خط 22). نمی‌توان از یک کلاس abstract نمونه ایجاد کرد ولی از کلاس‌هایی که از این نوع کلاس‌ها مشتق می‌شوند، می‌توان نمونه ایجاد کرد. نکته آخر هم این که، لازم نیست برای ارث بری از کلاس‌های abstract از کلمه کلیدی open استفاده کنید.