نوع انتزاعی

**نوع انتزاعی** یا **نوع تجریدی**  در زبان‌های برنامه‌نویسی، یک نوع در سامانه نوع نامی است که «**نمی‌توان**» به صورت مستقیم آن را نمونه‌سازی کرد؛ نوعی که انتزاعی نیست -یعنی بتوان از آن نمونه‌سازی کرد- یک نوع **عینی** یا **غیرانتزاعی**  نام‌دارد. هر نمونه از یک نوع انتزاعی، یک نمونه از یک «زیرنوع عینی» می‌باشد. به نوع انتزاعی، **نوع وجودی**  هم می‌گویند.

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

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

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

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

```java
//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 با نوع‌دهی ایستا هستند. خیلی از زبان‌های با نوع‌دهی پویا ویژگی‌های معادل در آن‌ها موجود نیست (حتی در موقع استفاده از نوع‌دهی اردکی، انواع انتزاعی لازم نیستند)؛ با این حال، تریت‌ها در بعضی از زبان‌های دارای نوع‌دهی پویا مدرن یافت می‌شوند.

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

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

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

## پانویس

## منابع
* 

رده:نظریه نوع‌ها