در فصل اول کتاب طراحی الگو GoF به اهمیت دانستن تفاوت نوع شی و کلاس شی پرداخته است ما در اینجا به این بحث خواهم پرداخت.

کلاس و نوع اشیا اغلب به جای هم  استفاده می شود، در حالی که آنها معنای مختلفی دارند. آنها چه هستند؟ چگونه آنها هر دو با یک شیء ارتباط دارند؟ در این مقاله، ما در حال بررسی تفاوت ها و روابط بین همه آنها هستیم.

شی در مقایسه کلاس

تفاوت بین شی و کلاس باید برای اکثر برنامه نویسان مشخص باشد.

کلاس یک طرح یا الگو است که از آن اشیاء ایجاد می شوند.
شی یک نمونه از یک کلاس است.

در اینجا یک مثال ساده است(البته این مثال ها به زبان کاتلین بر گرفته از سایت کاتلین می باشد.):

 class A val a = A() 

در مثال فوق،A یک کلاس است، اما a به یک شی اشاره دارد. تمام اشیاء نمونه هایی هستند که با استفاده از این قالب ها(کلاس ها) ایجاد می شوند. ما می توانیم اشیای چندگانه را برای یک کلاس تعریف کنیم با استفاده از کلید واژه های کلاس(Class)، اما برای اعلان شی( object declaration)، بیان شی(object expression) و شیء همراه(companion object)، یک شی تک ایجاد می شود.

کلاس در مقایسه با نوع

این ساده بود، اما تفاوت بین کلاس و نوع چیست؟ مردم اغلب می پرسند: “آیا رشته یک نوع یا یک کلاس است؟” پاسخ معمول این است که “هر دو به این دلیل است که هر کلاس یک نوع است”. واقعا درست نیست ما باید بین این  دو چیز متفاوت، تفاوت را تشخیص دهیم:

طبقه بندی ها، یعنی کلاس ها و رابط ها(Classifiers, i.e. classes and interfaces)
انواع(Types)

طبقه بندی ها مجموعه ای از انواع تولید می کنند. بیایید به مثال نگاه کنیم:

 

 class A val a = A() 

ما می توانیم بگوییم که در بخش بالا، تعریف کلاس A را می بینیم، اما شی a، از جنس A  است. بنابراین A هم نام کلاس و هم نوع است. کلاس یک قالب برای یک شی است، اما یک شیء بتونی یک نوع است. در واقع، هر عبارت دارای یک نوع است! در اینجا ساده سازی  تعاریف کلاس و نوع آمده  است:

یک نوع خلاصه ویژگی های مشترک مجموعه ای از اشیاء با ویژگی های مشابه است. ممکن است بگوییم یک نوع یک رابط انتزاعی است که مشخص می کند چگونه یک شی را می توان استفاده کرد.

یک کلاس نشان دهنده اجرای نوع است. این یک ساختار داده دقیق و مجموعه ای از روش ها است.

ما گفته ایم که هر طبقه بندی(classifier) مجموعه ای از انواع تولید می کند. در اغلب موارد، یک نوع واحد تولید می کند، اما یک نمونه که یک کلاس واحد یک نوع چندگانه را تولید می کند، یک کلاس عمومی(generic) است:


class Box<T>

 

Box کلاس است، در حالی که جعبه  (Box<Int>) ، <A> Box، Box <list<String >> انواع تولید شده توسط کلاس عمومی Box است. توجه داشته باشید که primitives و arrays در جاوا یک کلاس یا رابط ندارند، اما آنها نوع هستند. همه این اصطلاحات از نظر تئوری دسته بندی می آید که بسیار متناسب با علم کامپیوتر علمی است. اگر شما بیشتر نیاز دارید، اینجا یک مقاله دانشگاهی عالی درباره تمایز بین نوع و کلاس است.

در نهایت هم تفاوت نوع و کلاس در این لینک به طرز رساتری تفاوت را شرح داده است.

نوع از لحاظ مفهومی یک طبقه فوقانی از کلاس  است. به معنای وسیع تر، یک کلاس یک  نمونه از نوع است. رابطه ای نزدیک به کلاسها، رابطه ای هستند که میتوانند به عنوان یک نوع بسیار خاص از کلاس دیده شوند  البته از نوع   کاملا انتزاعی. بنابراین “نوع” شامل کلاس ها، رابط ها و اکثر primitives زبان ها هستند. همچنین سکوهای دات نت مایکروسافت هم دارای ساختارهای انواع  هستند.

نوع شامل توضیحات داده (به عنوان مثال متغیرها،  متدها، و غیره) در نظر گرفته می شود.  کلاس یک نوع خاص است. این یک قالب یا الگو برای ایجاد نمونه هایی از اشیاء است. کلاس دقیقا یک مفهوم خاص است، آن را می توان به عنوان یک بسته حاوی داده های برای توصیف  شی در نظر گرفت. برای مثال در C # شما می توانید رابط ها و کلاس ها را پیدا کنید. هر دوی آنها نوع هستند، اما رابط کاربری تنها می تواند برخی از قرارداد را تعریف کند و نمی تواند بر خلاف کلاس ها  از آن نمونه سازی شود. به عبارت ساده کلاس نوع خاصی است که برای جا دادن خواص و رفتار یک شی مورد استفاده قرار می گیرد.

 

برچسب‌ها , , , , , , , , , , , , , , , , , , , , ,


دیدگاهتان را بنویسید

Want to see your ugly mug by your comment? Get a free custom avatar at Gravatar.