معرفی
چرا به آن کلاس ناقص می گوییم؟
حداقل از یک عضو تشکیل شده است که ممکن است متد یا ویژگی باشد که دارای امضا باشد، اما پیاده سازی یا بدنه ندارد.
مثلا:
یک تابع در یک کلاس انتزاعی اعلام می شود، اما منطقی که باید در آن تابع ارائه شود ناشناخته است. این ناقص خواهد ماند و به همین دلیل است که آن را یک کلاس ناقص در نظر می گیریم و وقتی یک کلاس ناقص است نمی توانید نمونه ای از آن کلاس ایجاد کنید .
کلاس هایی که در واقعیت به عنوان یک کلاس انتزاعی علامت گذاری شده اند را نمی توان به درستی تعریف کرد. می دانیم که یک کلاس این ویژگی را دارد، اما آن ویژگی چگونه رفتار می کند، از چه ویژگی تشکیل شده است، نمی توان آن را به درستی تعریف کرد؟ در چنین مواردی آن را به عنوان یک کلاس انتزاعی علامت گذاری می کنیم.
بهترین مثال در این مورد یک ماشین است.
فرض کنید از شما خواسته ام کلاسی به نام Car ایجاد کنید و تمام ویژگی ها را به صورت اعضا (function/property) مشخص کنید. سپس، می خواهم ویژگی های یک ماشین را توضیح دهید، سپس آن را چگونه توصیف می کنید.
مثلا:
- در جاده حرکت می کند
- چرخ=4
- فرمان=1
- درها=؟، آنجا گیر کردم.
آیا 4 درب در هر خودرو اجباری است؟
آیا همه ماشین ها 4 در هستند؟ به طور معمول آنها 4 در دارند، اما اگر یک ماشین اسپرت بگیرید، فقط 2 در دارد.
مثال
ماشین Reva یک ماشین الکتریکی است که فقط 2 در دارد.
خب چه چیزی را مشخص کنم، درها=چی؟
برخی از خودروهای بسیار طولانی در ایالات متحده وجود دارند که دارای 6 در هستند، اما تعداد درها متفاوت است. خب، چه شماره ای باید ارائه کنم؟ من نمی توانم، یک ماشین در دارد، اما چقدر نمی توانم بگویم، فرق می کند، ناقص است. اگر ناقص باشد، به یک کلاس انتزاعی تبدیل می شود. میدانید که یک ویژگی دارد، اما مطمئن نیستید که این ویژگی چگونه کار میکند و چگونه رفتار میکند.
پس چگونه است که ما برای تعداد درب اجرا را فراهم می کنیم؟ کلاس مشتق شده تصمیم خواهد گرفت که چند در برای کلاس وجود دارد.
- using System;
- abstract class car
- {
- public int Wheels
- {
- get
- {
- return (4);
- }
- }
- public void Moves()
- {
- Console.WriteLine("moves on the road");
- Console.WriteLine("uses fuel to move");
- }
- public abstract int Doors
- {
- get;
- }
- }
- class Reva: car
- {
- public override int Doors
- {
- get
- {
- return (2);
- }
- }
- }
- class Demo
- {
- static void Main()
- {
- Reva obj = new Reva();
- obj.Moves();
- Console.WriteLine("Number of Wheels:" + obj.Wheels);
- Console.WriteLine("Number of Doors:" + obj.Doors);
- }
- }
حرکت در جاده
از سوخت برای حرکت استفاده می کند
تعداد چرخ ها:4
تعداد درها:2
فرض کنید من به هیچ وجه در کلاس پایه (car) خاصیت doors را اعلام نکنم، پیاده سازی را در کلاس مشتق شده ارائه خواهم کرد.
در این صورت نیازی به اعلان به عنوان یک کلاس انتزاعی نیست، زمانی که ارث بری آن ها در آنجا انجام می شود، می تواند یک کلاس عادی باشد، اگر doors وجود داشته باشد، شما ذکر کنید که doors=2 است.
فرض کنید آن را در کلاس پایه (ویژگی doors) اعلام کرده اید، اما کلاس مشتق شده، doors=2 را ذکر نمی کند، سپس با یک خطای کامپایلی مواجه می شوید که می گوید عضو انتزاعی آنجا است، بدنه ای نیست که باید آن را بدهید. بدن
فرض کنید اگر شما آن را در کلاس پایه اعلام نکنید، میگویید که باید توسط کلاس مشتق داده شود، اگر برنامهنویس کلاس مشتق شده فراموش کرده باشد که درها را ذکر کند، خطای عارضهای وجود ندارد، برنامه کامپایل میشود، ماشین reva تولید میشود و در آن رها میشود . بازار اما درب ندارد که این مشکل است. چون شما آن را در کلاس پایه اعلام نمی کنید، نه، بنابراین فکر می کنید که با کلاس مشتق شده (reva) تعریف می شود.
فرد کلاس dervied فراموش کرده است ذکر کند، بنابراین وقتی مطمئن نیستید که آن را اعلام کرده اید و توسط کلاس مشتق شده (reva) مجبور به اجرای آن هستید، باید اجرا کنند.