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

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

   1: using System;
   2: 
   3: public abstract class Base
   4: {
   5:     protected int number;
   6:     protected string name;
   7: 
   8:     public abstract int Number
   9:     {
  10:         get;
  11:         set;
  12:     }
  13: 
  14:     public string Name
  15:     {
  16:         get { return name; }
  17:         set { name = value; }
  18:     }
  19: 
  20:     public abstract void ShowMessage();
  21: 
  22:     public Base(int number, string name)
  23:     {
  24:         this.number = number;
  25:         this.name = name;
  26:     }
  27: }
  28: 
  29: public class Derived : Base
  30: {
  31:     public override void  ShowMessage()
  32:     {
  33:         Console.WriteLine("Hello World!");
  34:     }
  35: 
  36:     public override int Number
  37:     {
  38:         get
  39:         {
  40:             return number;
  41:         }
  42:         set
  43:         {
  44:             number = value;
  45:         }
  46:     }
  47: 
  48:     public Derived(int number, string name)
  49:         : base(number, name)
  50:     {
  51:     }
  52: }

در داخل کلاس انتزاعی دو فیلد محافظت شده (protected) تعریف کرده‌ایم که توسط خواص (property) برنامه مورد استفاده قرار می‌گیرند. یکی از property ها را به صورت انتزاعی (abstract) تعریف کرده‌ایم (خط 8). به این نکته توجه کنید که برای تعریف این خاصیت کلمه کلیدی abstract را به کار برده‌ایم.

این property باید به وسیله کلاسهایی که از این کلاس ارث می‌برند override شود ولی از آن جاییکه به صورت abstract تعریف شده است قسمتهای set و get فاقد بدنه هستند. می‌بینید که کلاسهای abstract می‌توانند شامل property های معمولی مانند property، Name مثال بالا باشند.

یک متد abstract تعریف می‌کنیم. همانطور که مشاهده می‌کنید کلاسهای abstract می‌توانند شامل property های معمولی مانند خاصیت Name (خطوط 20-16) باشند. در کلاس مشتق نیز از کلمه کلیدی abstract استفاده شده و کلاس باید این متد را override کند (به صورت دیگر پیاده سازی کند (خط 33)). کلاسهای abstract حداقل باید یک عضو abstract داشته باشند.

یک کلاس دیگر تعریف می‌کنید که از کلاس Base ارث بری کند. سپس با استفاده از کلمه کلیدی override یک خاصیت abstract و همچنین یک متد را به صورت دیگر پیاده سازی می‌کنیم (override کنیم)(خطوط 33 تا 48). همچنین یک سازنده تعریف می‌کنیم و با استفاده از کلمه کلیدی Base مقادیر پارامترها را به سازنده پایه ارسال می‌کنیم. نمی‌توان از یک کلاس abstract نمونه ایجاد کرد ولی از کلاس‌هایی که از این نوع کلاس‌ها مشتق می‌شوند، می‌توان نمونه ایجاد کرد.