اصلاحگر abstract نشان میدهد که چیزی که اصلاح می شود، دارای پیاده سازی مفقود یا غیرکامل است. اصلاحگر abstract می تواند همراه با کلاس ها، پراپرتی ها، ایندکسر ها و رویدادها استفاده شود. برای اینکه نشان دهید کلاس فقط قصد دارد یک کلاس پایه برای کلاس های دیگر باشد، از اصلاحگر abstract در اعلان کلاس استفاده کنید. اعضای علامتگذاری شده با abstract و یا اعضایی که در داخل یک کلاس abstract قرار دارند، باید توسط کلاس هایی که از کلاس abstract ارث بری می کنند، پیاده سازی شوند.
مثال
در این مثال کلاس Square باید یک پیاده سازی از Area ارائه دهد، زیرا از ShapesClass مشتق شده:
abstract class ShapesClass { abstract public int Area(); } class Square : ShapesClass { int side = 0; public Square(int n) { side = n; } // Area method is required to avoid // a compile-time error. public override int Area() { return side * side; } static void Main() { Square sq = new Square(12); Console.WriteLine("Area of the square = {0}", sq.Area()); } interface I { void M(); } abstract class C : I { public abstract void M(); } } // Output: Area of the square = 144
کلاس های چکیده (ابسترکت) دارای ویژگی های زیر میباشند:
- کلاس های چکیده نمی توانند نمونه سازی شوند.
- یک کلاس چکیده ممکن است حاوی متدها و دسترسی کننده های (اکسسور) چکیده باشد.
- این امکان وجود ندارد که یک کلاس با اصلاحگر sealed توسط اصلاحگر abstract اصلاح شود، زیرا هردو اصلاحگر مفهوم متضاد دارند. اصلاحگر sealed از اینکه یک کلاس مورد ارث بری قرار گیرد جلوگیری می کند و این درحالی است که اصلاحگر abstract به کلاسی برای ارث بری نیاز دارد.
- کلاس غیر-چکیده ای که از یک کلاس چکیده مشتق شده باید حاوی پیاده سازی های واقعی از همه متدها و دسترسی کننده های ارث بری شده، باشد.
برای اینکه نشان دهید که متد یا پراپرتی ای خاص حاوی پیاده سازی نیستند، از اصلاحگر abstract در اعلانشان استفاده کنید.
متدهای چکید دارای ویژگی های زیر هستند:
- متد چکیده بطور ضمنی متد مجازی (virtual) است.
- اعلان های متد چکیده فقط در کلاس های چکیده مجاز می باشند.
- به این دلیل که اعلان متدهای چکیده، هیچ پیاده سازی واقعی را ارائه نمی دهند، داری بدنه متد نیستند؛ اعلان متد بسادگی با یک نقطه وریگول پایان می یابد و بعد از امضای متد آکولاد وجود ندارد. برای مثال:
public abstract void MyMethod();
پیاده سازی، با رونویسی متد override که عضوی از یک کلاس غیر-انتزاعی (non-abstract) است تأمین می شود.
- استفاده از اصلاحگرهای static یا virtual در اعلان متد abstract ، خطا محسوب می شود.
پراپرتی های چکیده و متدهای چکیده ، به استثناء تفاوت های آنها در نحوه اعلان و فراخوانی، مانند هم رفتار می کنند.
- استفاده از اصلاحگر abstract بر روی پراپرتی static خطا محسوب می شود.
- یک پراپرتی ارث بری شده ی انتزاعی می تواند در یک کلاس مشتق شده، با اضافه کردن اصلاحگر override در اعلان پراپرتی، رونویسی شود.
یک کلاس انتزاعی باید برای تمام اعضای رابطش، پیاده سازی ارائه دهد.
یک کلاس انتزاعی که یک رابط را پیاده سازی می کند متدهای رابط را به متدهای انتزاعی، نگاشت کند. برای مثال:
interface I { void M(); } abstract class C : I { public abstract void M(); }
در این مثال، کلاس DrivedClass از کلاس انتزاعی BaseClass مشتق شده. کلاس انتزاعی حاوی متد انتزاعی AbstractMethod و دو پراپرتی انتزاعی X و Y است.
abstract class BaseClass // Abstract class { protected int _x = 100; protected int _y = 150; public abstract void AbstractMethod(); // Abstract method public abstract int X { get; } public abstract int Y { get; } } class DerivedClass : BaseClass { public override void AbstractMethod() { _x++; _y++; } public override int X // overriding property { get { return _x + 10; } } public override int Y // overriding property { get { return _y + 10; } } static void Main() { DerivedClass o = new DerivedClass(); o.AbstractMethod(); Console.WriteLine("x = {0}, y = {1}", o.X, o.Y); } } // Output: x = 111, y = 161
در مثال قبل، اگر تلاش کنید که با جمله ای مانند
BaseClass bc = new BaseClass(); // Error
کلاس abstract را نمونه سازی کنید، با یک خطا مواجه می شوید که می گوید کامپایلر نمی تواند نمونه ای از کلاس انتزاعی 'BaseClass' بسازد.