مجازی در مقابل چکیده
Virtual و Abstract دو کلمه کلیدی هستند که در اکثر زبان های برنامه نویسی شی گرا (OO) مانند جاوا و C استفاده می شوند. اگرچه تفاوتهای جزئی در معنای آن در زبانهای مختلف وجود دارد، اما کلمات کلیدی مجازی و انتزاعی هر دو حس اجرای جزئی را برای موجودیتهایی که به آنها متصل میشوند، ارائه میدهند.
چکیده
معمولاً، کلاس های Abstract، که به عنوان کلاس های پایه Abstract (ABC) نیز شناخته می شوند، نمی توانند نمونه سازی شوند (نمونه ای از آن کلاس نمی تواند ایجاد شود). بنابراین، کلاس های Abstract تنها زمانی معنادار هستند که زبان برنامه نویسی از وراثت پشتیبانی کند (توانایی ایجاد کلاس های فرعی از گسترش یک کلاس).کلاس های انتزاعی معمولاً یک مفهوم یا موجودیت انتزاعی را با اجرای جزئی یا بدون اجرا نشان می دهند. بنابراین، کلاسهای Abstract بهعنوان کلاسهای والد عمل میکنند که کلاسهای فرزند از آنها مشتق میشوند، به طوری که کلاس فرزند ویژگیهای ناقص کلاس والد را به اشتراک میگذارد و میتوان برای تکمیل آنها قابلیت اضافه کرد. کلاس های انتزاعی ممکن است حاوی متدهای Abstract باشند. زیر کلاس هایی که یک کلاس انتزاعی را گسترش می دهند ممکن است این متدهای Abstract (ارثی) را پیاده سازی کنند. اگر کلاس فرزند تمام این متدهای Abstract را پیاده سازی کند، یک کلاس مشخص است. اما اگر اینطور نباشد، کلاس فرزند نیز به کلاس Abstract تبدیل می شود. معنی همه اینها این است که وقتی برنامه نویس کلاسی را به عنوان Abstract معرفی می کند، می گوید که کلاس ناقص خواهد بود و دارای عناصری است که باید توسط زیر کلاس های ارثی تکمیل شوند. این یک راه خوب برای ایجاد قرارداد بین دو برنامه نویس است که کار در توسعه نرم افزار را ساده می کند. برنامه نویسی که برای ارث بردن کد می نویسد، باید دقیقاً از تعاریف روش پیروی کند (اما البته می تواند پیاده سازی خود را داشته باشد).در جاوا و سی شارپ، کلاسها و متدهای Abstract با استفاده از کلمه کلیدی Abstract اعلام میشوند.
مجازی
روشها/توابع مجازی این امکان را فراهم میکنند که بهصورت اختیاری رفتار آن توسط یک کلاس ارث بری (با استفاده از تابعی با امضای یکسان) لغو شود. مفهوم تابع مجازی در سناریوی زیر مهم است. فرض کنید یک کلاس توسط یک کلاس فرزند مشتق شده است، سپس هر زمان که یک شی از کلاس مشتق شده استفاده می شود، ممکن است به یک شی از کلاس پایه یا کلاس مشتق شده اشاره کند. اما، رفتار فراخوانی متد میتواند مبهم باشد اگر متدهای کلاس پایه لغو شوند. بنابراین برای رفع این ابهام از کلمه کلیدی مجازی استفاده شده است. اگر متد Virtual علامت گذاری شود، تابع کلاس مشتق شده (در صورت وجود) یا تابع کلاس پایه فراخوانی می شود. به عنوان مثال در C++ از کلمه کلیدی مجازی دقیقا برای این منظور استفاده می شود. در سی شارپ از کلمه کلیدی Virtual به روشی مشابه استفاده می شود، اما علاوه بر این باید از کلمه کلیدی override برای اصلاح همه روش های overrid شده استفاده کرد.اما در جاوا هیچ کلمه کلیدی مجازی صریحی وجود ندارد. تمام روش های غیر استاتیک مجازی در نظر گرفته می شوند. توابع مجازی بدون بدن را توابع مجازی خالص می نامند. در جاوا و سی شارپ، متدهای Abstract در واقع مجازی خالص هستند.
تفاوت بین مجازی و چکیده
اگرچه Abstract و Virtual دو کلمه/مفهوم کلیدی هستند که معنای پیاده سازی ناقص را برای موجودیت های مرتبط ارائه می دهند، اما تفاوت های خود را دارند. متدهای انتزاعی (که باید در کلاس های Abstract تعریف شوند) اصلا پیاده سازی ندارند، در حالی که متدهای مجازی ممکن است پیاده سازی داشته باشند. اگر متدهای Abstract توسط یک کلاس مشخص توسعه داده شوند، همه متدهای Abstract ارثی باید پیاده سازی شوند، در حالی که روش های Virtual ارثی ممکن است نادیده گرفته شوند یا نشوند.