| سیستم نوع‌ها |
| --- |
| 
مفاهیم کلی |
| * ایمنی نوع
 |
| 
طبقه های اصلی |
| * ایستا دربرابر پویا
* آشکار دربرابر استنباطی
* نامی در برابر ساختاری
* نوع‌دهی اردکی
 |
| 
طبقه های جزیی |
| * وابسته
* حساس به جریان
* تدریجی
* تقاطعی
* پنهان
* پالایشی
* زیر ساختاری
* یکتایی
* انتزاعی
 |
| 
جستارهای وابسته |
| * نوع‌دهی قوی و ضعیف
 |
| * ن
* ب
* و
 |

**نوع انتزاعی** یا **نوع تجریدی** (به انگلیسی: abstract type) در زبان‌های برنامه‌نویسی، یک نوع در سامانه نوع نامی است که «**نمی‌توان**» به صورت مستقیم آن را نمونه‌سازی کرد؛ نوعی که انتزاعی نیست -یعنی بتوان از آن نمونه‌سازی کرد- یک نوع **عینی** یا **غیرانتزاعی** (به انگلیسی: concrete) نام‌دارد. هر نمونه از یک نوع انتزاعی، یک نمونه از یک «زیرنوع عینی» می‌باشد. به نوع انتزاعی، **نوع وجودی** (به انگلیسی: existential) هم می‌گویند.

یک نوع انتزاعی، یا هیچ پیاده‌سازی ارائه نداده‌است یا یک پیاده‌سازی ناکامل را تهیه دیده است. در بعضی زبان‌ها، انواع انتزاعی بدون پیاده‌سازی (و نه پیاده‌سازی ناکامل) را با نام‌های پروتکل، واسط، امضا، یا نوع کلاس هم می‌شناسند. در برنامه‌نویسی شیءگرای مبتنی بر کلاس، انواع انتزاعی به صورت کلاس‌های انتزاعی پیاده‌سازی می‌شوند (که به آن‌ها کلاس‌های مبتنی بر انتزاع هم می‌گویند)، در این موارد، به انواع عینی، کلاس‌های عینی نیز می‌گویند. در برنامه‌نویسی همگانی، این ایده مشابه یک «مفهوم» (به انگلیسی: concept) است، که به صورت مشابه هم نحو و هم معنا را مشخص می‌کند، اما نیازی به رابطه زیرنوع ندارد؛ یعنی دو نوع غیرمرتبط می‌توانند یک مفهوم مشابه را برآورده‌سازی کنند.

معمولاً انواع انتزاعی، دو یا بیشتر پیاده‌سازی دارند، که این پیاده‌سازی‌ها به صورت جداگانه ارائه شده‌اند، مثلاً به حالت زیرنوع عینی‌ای هستند که قابل نمونه‌برداری اند. در برنامه‌نویسی شیءگرا، یک «کلاس انتزاعی» می‌تواند شامل «شگردهای انتزاعی» یا «ویژگی‌های انتزاعی» باشد، که این موارد در زیرکلاس‌هایش به اشتراک گذاشته می‌شوند. نام‌های دیگر برای ویژگی‌های زبانی که باید حتماً (یا به صورت اختیاری) برای پیاده‌سازی انواع انتزاعی استفاده شود، شامل تریت، میکس‌این، فلیور (به انگلیسی: flavors)، نقش‌ها، یا کلاس‌های نوع است.

اشاره به انواع انتزاعی
----------------------

کلاس‌های انتزاعی را به چند روش می‌توان ساخت، اشاره‌کرد، یا شبیه‌سازی نمود:

* به کمک کلیدواژه `abstract`در تعریف کلاس، که این موضوع در جاوا، D و C# وجود دارد.
* با شامل کردن آن در تعریف کلاس، یک یا بیشتر شگرد انتراعی (که در C++ به آن توابع مجازی خالص گفته می‌شود)، که کلاس آن را تعریف کرده‌است تا به عنوان بخشی از پروتکل آن بپذیرد، اما هیچ پیاده‌سازی برای آن موجود نیست.
* با ارث‌بری از یک نوع انتزاعی، و عدم رونویسی همه ویژگی‌های غیرموجود که برای تکمیل تعریف کلاس لازم است. به زبان دیگر، یک نوع فرزند که همه شگردهای انتزاعی را از والدش پیاده‌سازی نمی‌کند، خودش یک نوع انتزاعی می‌شود.
* در خیلی از زبان‌های دارای نوع پویا، مثل اسمال‌تاک، هر کلاسی که یک شگرد را به this ارسال کند، اما آن متد را پیاده‌سازی نکند، را می‌توان انتزاعی درنظر گرفت. (با این حال در خیلی از این زبان‌ها مثل آبجکتیو-سی، تا زمان استفاده از آن کلاس، خطایی تشخیص داده نمی‌شود، و پیام، نتایج را در پیام خطای استثنا برمی‌گرداند، مثل "Does not recognize selector: xxx" به صورت `- [NSObject doesNotRecognizeSelector:(SEL)selector]`] در موقع تشخیص یک شگرد پیاده‌سازی نشده فراخوانی می‌شود).

### مثال در جاوا

```
//By default, all methods in all classes are concrete, unless the abstract keyword is used.
abstract class Demo {
 // An abstract class may include abstract methods, which have no implementation.
 abstract public int sum(int x, int y);

 // An abstract class may also include concrete methods.
 public int product(int x, int y) { return x\*y; }
}

//By default, all methods in all interfaces are abstract, unless the default keyword is used.
interface DemoInterface {
 [abstract] int getLength(); //Abstract can be used here, though is completely useless

 //The default keyword can be used in this context to specify a concrete method in an interface
 default int product(int x, int y) {
 return x \* y;
 }
}

```

استفاده از انواع انتزاعی
------------------------

انواع انتزاعی یک ویژگی مهم در زبان‌های OOP با نوع‌دهی ایستا هستند. خیلی از زبان‌های با نوع‌دهی پویا ویژگی‌های معادل در آن‌ها موجود نیست (حتی در موقع استفاده از نوع‌دهی اردکی، انواع انتزاعی لازم نیستند)؛ با این حال، تریت‌ها در بعضی از زبان‌های دارای نوع‌دهی پویا مدرن یافت می‌شوند.

بعضی از نویسندگان گفته‌اند که کلاس‌ها یا باید کلاس‌های برگ باشند (بدون زیرنوع) یا اینکه انتزاعی باشند.

انواع انتزاعی از این نظر مهم‌اند که از آن‌ها می‌توان برای تعریف و تحمیل یک «پروتکل» استفاده کرد؛ که پروتکل مجموعه ای از عملیات است که همهٔ اشیایی که پروتکل را پیاده‌سازی می‌کنند، باید از آن پشتیبانی کنند.

انواع انتزاعی بخش مهمی از «مدل شگرد الگو» می‌باشد.

پانویس
------

1. ↑  «*تجرید*» [*رایانه و فناوری اطلاعات*] هم‌ارزِ «*abstraction*»؛ منبع: گروه واژه‌گزینی. جواد میرشکاری، ویراستار. *دفتر سیزدهم*. فرهنگ واژه‌های مصوب فرهنگستان. تهران: انتشارات فرهنگستان زبان و ادب فارسی (ذیل سرواژهٔ *تجرید*)
2. ↑  Mitchell, John C. ; Plotkin, Gordon D. ; *Abstract Types Have Existential Type*, ACM Transactions on Programming Languages and Systems, Vol. 10, No. 3, July 1988, pp. 470–502
3. 1 2  "Abstract Methods and Classes (The Java™ Tutorials> Learning the Java Language> Interfaces and Inheritance)". *Oracle.com*. Retrieved 2019-08-14.
4. ↑  "Pure Virtual Functions and Abstract Classes in C++". *GeeksforGeeks.org*.
5. ↑  Riel, Arthur (1996). *Object-Oriented Design Heuristics*. Addison-Wesley Professional. p. 89. ISBN 0-201-63385-X.
6. ↑  Meyers, Scott (1996). *More Effective C++*. Addison-Wesley Professional. p. 258. ISBN 0-201-63371-X. Make non-leaf classes abstract

منابع
-----

* مشارکت‌کنندگان ویکی‌پدیا. «Abstract type». در *دانشنامهٔ ویکی‌پدیای انگلیسی*، بازبینی‌شده در ۲۱ بهمن ۱۳۹۹.