مفهوم کلاس در برنامه نویسی — همراه با نمونه مثال عملی
کلاسها و اشیا از مفاهیم بنیادی در ساختمان داده و الگوریتمها به حساب میآیند. یادگیری مفهوم کلاس در تمام زبانهای برنامه نویسی شی گرا از جمله جاوا، پایتون، سی شارپ، روبی و سایر زبانها پایه و اساس آموزش شی گرایی به حساب میآید. در این مقاله، مفهوم کلاس در برنامه نویسی شی گرا و دیگر مفاهیم مربوط به کلاس در شی گرایی ، از جمله شی، صفت، متد، سازنده و سایر موارد به بیان ساده شرح داده شدهاند. همچنین نمونه کُدها و مثالهای مختلفی با زبانهای برنامه نویسی رایج مثل جاوا، پایتون و سی شارپ برای درک بهتر مفهوم کلاس در برنامه نویسی ارائه شده است. این مقاله تا حد امکان مستقل از یک زبان برنامه نویسی خاص تدوین شده است، با این هدف که بتوان از این آموزش در هر زبانی استفاده کرد.
در مقاله آموزش مفهوم کلاس در برنامه نویسی ، ابتدا به مباحث نظری و تعاریف مربوطه پرداخته و به برخی سوالهای رایج پیرامون مفهوم کلاس در برنامه نویسی شی گرا پاسخ داده شده است. پس از آن، مفهوم کلاس در برنامه نویسی شی گرا و سایر مفاهیم مرتبط با آن در قالب یک مثال بسیار ساده و ابتدایی و به صورت عملی آموزش داده شده است. آموزشهای عملی در سه بخش مفهوم کلاس در جاوا، مفهوم کلاس در پایتون و مفهوم کلاس در سی شارپ ارائه شده است. در ادامه به سوال اصلی این مقاله یعنی چیستی مفهوم کلاس در برنامه نویسی پاسخ داده شده است.
مفهوم کلاس در برنامه نویسی چیست ؟
در برنامه نویسی شی گرا ، کلاس یک قالب کدنویسی توسعهپذیر برای ایجاد اشیا است. کلاس مقادیر اولیه را برای وضعیت (متغیرهای عضو) و پیادهسازی رفتار (توابع یا متدهای عضو) فراهم میکند. در یک کلاس ، مجموعهای از خصوصیتها (Property) و متدهایی تعریف میشوند که برای همه اشیا از آن نوع مشترک هستند. برای مثال، یک کلاس میتواند یک خودرو باشد که دارای خصوصیتهای «رنگ» و «داشتن چهار چرخ» باشد.
همچنین در یک کلاس ماشین یا خودرو، از «رانندگی کردن» میتوان به عنوان یک متُد نام برد. در بخشهای بعدی این مقاله شامل بخش مفهوم کلاس در جاوا، مفهوم کلاس در پایتون و مفهوم کلاس در سی شارپ، آموزش مفهوم کلاس در برنامه نویسی شی گرا به طور جامع و به صورت عملی ارائه خواهد شد. اما، همانطور که بیان شد، مفهوم کلاس در برنامه نویسی شی گرا مطرح میشود و بنابراین، در ادامه تعریف کوتاهی از برنامه نویسی شی گرا ارائه شده است.
برنامه نویسی شی گرا چیست ؟
برنامه نویسی شی گرا (Object Oriented Programming) که به اختصار با سرنام OOP خطاب میشود، روشی در برنامه نویسی است که در آن از اشیا استفاده میشود. یک شی درست مثل یک موجودیت در جهان واقعی میتواند دارای صفات و قابلیتهای عملکردی باشد.
برنامه نویسی شی گرا برای ساختاردهی به یک برنامه نرمافزاری و تبدیل آن به قطعات ساده و قابل استفاده مجدد به کار میرود. مهارتهای برنامه نویسی شی گرا برای نزدیکتر کردن مفاهیم برنامه نویسی به مفاهیم دنیای واقعی پدید آمدهاند.
هدف برنامه نویسی شی گرا ، پیادهسازی نهادهای جهان واقعی همچون وراثت (ارثبری)، پنهانسازی، چندریختی (Polymorphism) و دیگر قابلیتها در برنامه نویسی است. هدف اصلی OOP پیوند دادن دادهها و توابعی است که روی آن دادهها عملیات انجام میدهند. برنامه نویسی شی گرا برای رفع کاستیها و مشکلات برنامه نویسی رویهگرا یا Procedural به وجود آمده است. با استفاده از برنامه نویسی شی گرا فرآیند کدنویسی، درک و ویرایش کدها سادهتر و حجم برنامه کمتر میشود. اولین مفهوم و موجودیتی که همواره در برنامه نویسی شی گرا مطرح میشود شی (object) است. بنابراین، بهتر است در ادامه مقاله مفهوم کلاس در برنامه نویسی به شرح آن پرداخته شود.
شی چیست ؟
به بیان ساده، شی در برنامه نویسی شی گرا یک نمونه (Instance) از یک کلاس به حساب میآید. یعنی کلاس نقشه ساختی است که شی با استفاده از آن ایجاد میشود. شی یک نوع داده انتزاعی است که توسط یک برنامه نویس ایجاد میشود. یک شی میتواند چندین خصوصیت (یا همان صفت یا همان متغیر) و چندین متد (یا همان تابع) داشته باشد. کلاسها و اشیا یک رویکرد ساختارمند را در برنامه نویسی به وجود میآورند.
در مثالی ساده، میتوان حساب کاربری ایجاد شده برای یک وبسایت را به عنوان یک شی در نظر گرفت. مثلاً این شی میتواند بر اساس کلاسی با نام userAccount ایجاد شود و دارای صفتهایی نظیر نام، آدرس ایمیل، رمز عبور، سن و سایر موارد باشد. معمولاً ابهاماتی در مورد تفاوت کلاس و شی در شروع آموزش برنامه نویسی شی گرا پدید میآید. در این راستا، در ادامه به شرح تفاوت کلاس و شی پرداخته شده است.
تفاوت کلاس و شی چیست ؟
شی یک نمونه یا Instance از کلاس است. برای بیان تفاوت کلاس و شی میتوان یک کلاس را مثل یک قالب در نظر گرفت که شی بر اساس آن ایجاد میشود. کلاس یک نقشه ساخت است و شی نمونهای است که طبق آن نقشه ساخت ایجاد میشود. میتوان چندین شی از یک کلاس ایجاد کرد. اشیا تولید شده از یک کلاس وجوه مشترکی دارند و در کنار این وجوه مشترک، هر کدام دارای تفاوتهایی هستند و خصوصیات مخصوص به خودشان را دارند.
یک کلاس خصوصیتها و رفتارهای اشیا نمونهسازی شده از خودش را تعیین میکند. یک شی دارای یک وضعیت است که در آن همه خصوصیتهایش مقادیری دارند که یا به طور مشخص تعریف میشوند یا به طور پیشفرض از قبل در کلاس تعریف شدهاند. در ادامه، فهرستی از برخی تفاوتهای کلیدی کلاس و شی ارائه شده است:
- یک کلاس قالبی برای ایجاد اشیا در برنامه است، در حالی که شی نمونهای از یک کلاس به شمار میرود.
- کلاس یک موجودیت منطقی است، در حالی که شی یک موجودیت فیزیکی به حساب میآید.
- با تعریف یک کلاس حافظهای به آن اختصاص داده نمیشود، در حالی که با ایجاد یک شی، به آن در حافظه فضا اختصاص داده میشود.
- یک کلاس خاص تنها یک بار تعریف میشود. اما میتوان چندین شی با استفاده از یک کلاس ایجاد کرد.
هر کلاس موجودیتها و اجزای تشکیل دهندهای دارد که در ادامه هر یک از آنها نام برده و شرح داده شدهاند.
اجزای یک کلاس در برنامه نویسی شی گرا چه هستند؟
اجزای اصلی یک کلاس در برنامه نویسی شی گرا شامل خصوصیتها (صفتها یا متغیرها)، سازنده (Constructor) و متدها (توابع) است.
هر یک از این اجزا به طور مختصر در ادامه این بخش از مقاله آموزش مفهوم کلاس در برنامه نویسی شی گرا شرح داده شدهاند.
صفت های کلاس
در برنامه نویسی شی گرا (OOP)، کلاسها و اشیا دارای چند صفت (Attribute) هستند. صفتها دادههایی هستند که در داخل یک کلاس یا نمونهای از آن کلاس (شی) ذخیره میشوند. به اختصار، صفتها اطلاعاتی را پیرامون نمونهای از یک کلاس ذخیره میکنند. نباید صفتها را با توابع یک کلاس (که به آنها متُد نیز گفته میشود)، اشتباه گرفت. صفتها خصوصیتهای یک شی هستند. به همین دلیل به آنها خصوصیت (Property) هم گفته میشود. علاوه بر آن، به صفتهای یک کلاس یا شی، متغیر (Variable) هم میگویند. گاهی صفتهای یک شی را اعضای آن شی نیز خطاب میکنند.
متد کلاس
یک «متد» (Method) دقیقاً مشابه یک تابع در برنامه نویسی رویهگرا یا رویهای است که در داخل کلاس تعریف میشود. متد عملیاتی را روی اشیا یک کلاس انجام میدهد. در واقع، متد نماینده رفتار اشیا یک کلاس است. در دنیای واقعی، یک فرد علاوه بر خصوصیاتی که دارد، رفتاری را هم از خود بروز میدهد. مثلاً یک انسان غذا میخورد، راه میورد و بسیاری از رفتارهای دیگر را از خود بروز میدهد.
یک متد بازنمودی از رفتارهای اشیا در دنیای واقعی به حساب میآید. اغلب دو عبارت متد و تابع به جای هم به کار برده میشوند و میتوان گفت این دو مفهوم تقریباً یکسان هستند و تفاوت چندانی با هم ندارند. در بخشهای بعدی متدهای مختلفی به سه زبان جاوا، پایتون و سی شارپ تعریف شدهاند و توضیحات مفصلتری پیرامون متد در کلاس ارائه شده است.
سازنده کلاس
یک سازنده (Constructor) متد مخصوصی از یک کلاس در برنامه نویسی شی گرا است که یک شی تازه ایجاد شده از آن نوع را مقداردهی اولیه میکند. در اکثر زبانهای برنامه نویسی، هر گاه شیئی ایجاد میشود، سازنده به طور خودکار فراخوانی میشود. سازنده مشابه یک متد شی است که معمولاً نام یکسانی با کلاس دارد و میتوان از آن برای تنظیم مقادیر اعضای یک شی استفاده کرد. مقادیر یک شی را میتوان با استفاده از یک سازنده به مقادیر پیشفرض یا مقادیر تعریف شده توسط کاربر تغییر داد.
اگرچه، سازنده مشابه متد عملی میکند، اما واقعاً یک متد نیست، چرا که نوع بازگشتی ندارد. به جای انجام یک وظیفه به وسیله اجرای کد، سازنده شی را مقداردهی اولیه میکند و یک سازنده نمیتواند ایستا، نهایی، انتزاعی و همگام شده باشد. مثالها و توضیحات بیشتری پیرامون سازندهها در ادامه این مقاله به سه زبان جاوا، پایتون و سی شارپ ارائه شده است.
ممکن است مفاهیم نظری و تعاریف بیان شده تا اینجا گنگ و نامفهوم به نظر برسند و درک کاملی از آنها به وجود نیامده باشد. اما هیچ جای نگرانی وجود ندراد، چرا که در ادامه این مقاله کلیه مباحث مطرح شده تا این مقطع، به همراه مفاهیم دیگر مرتبط با مفهوم کلاس در برنامه نویسی شی گرا به طور جامع به همراه مثالهای مختلف به سه زبان جاوا، پایتون و سی شارپ ارائه شده است. ابتدا به شرح مفهوم کلاس در برنامه نویسی شی گرا در قالب یک مثال عینی و بسیار ساده با زبان جاوا پرداخته شده است.
مثال ساده برای درک مفهوم کلاس در برنامه نویسی
در این بخش از مقاله آموزش مفهوم کلاس در برنامه نویسی ، مثالی ساده و روان برای درک بهتر مفهوم کلاس در برنامه نویسی شی گرا ارائه شده است. برای مثال فردی قصد دارد یک وبسایت ایجاد کند. کارکرد این وبسایت به این صورت است که افراد میتوانند با مراجعه به آن با تعدادی ربات گفتگو کنند.
یعنی وقتی افراد احساس تنهایی میکنند، میتوانند به این وبسایت مراجعه و با یکی از رباتها صحبت کنند. بنابراین وقتی کاربر این سایت را باز میکند، با فهرستی از رباتها به صورت زیر مواجه خواهد شد:
در تصویر فوق، به عنوان نمونه دو تا از این رباتها با نامهای فرضی جمشید و تورج ملاحظه میشوند. علاوه بر نام، این دو ربات تفاوتهای دیگری هم دارند. اول از همه، رنگ تورج قرمز و همانطور که ملاحظه میشود، رنگ جمشید آبی است. جمشید و تورج از لحاظ سنگینی هم با هم تفاوت دارند و تورج سبُکتر از جمشید است. اگرچه، کارکرد این دو ربات یکسان است. مثلاً با کلیک کردن روی دکمه «خودت را معرفی کن» برای هر یک از این دو ربات، آنها خودشان را معرفی خواهند کرد.
برای شروع، همین میزان از قابلیتها و امکانات برای وبسایت کافی است. برای ایجاد چنین سیستمی، اساساً نیاز به راهی برای نمایش و بازنمایی این موجودیتها در زبانهای برنامه نویسی مختلف وجود دارد. چه زبان مورد استفاده جاوا، چه پایتون و چه جاوا اسکریپت باشد. اینجاست که مفهوم کلاس در برنامه نویسی و همچنین سایر مفاهیمی مثل شی مطرح میشوند. حال برای بازنمایی هر یک از رباتهای جمشید و تورج یا هر ربات دیگری در یک زبان برنامه نویسی، نیاز به ذخیرهسازی دو مجموعه از اطلاعات درباره آن وجود دارد. این دو مجموعه شامل خصوصیتها و توابع است که در ادامه به هر یک از آنها پرداخته شده است.
تعریف Property یا خصوصیت
اولین مجموعه از اطلاعاتی که باید ذخیره شوند، خصوصیتها یا خصیصههای هر ربات است. به خصوصیت در انگلیسی Property گفته میشود. به عنوان مثال، یکی از رباتها دارای خصوصیتهایی به صورت زیر است:
خصوصیتهای ربات تورج در تصویر فوق ملاحظه میشوند. حال نوبت به تعیین قابلیتهای این ربات فرا میرسد که در ادامه شرح داده شده است.
تعیین توابع یا قابلیتها
مجموعه قابلیتهای (Functionality | کارکرد) هر ربات، دومین دسته از اطلاعاتی است که باید ذخیره شوند. همانطور که پیشتر ملاحظه شد، تنها یک قابلیت برای رباتهای وبسایت فرضی در این مثال وجود دارد. تنها قابلیت رباتها در این مثال، معرفی کردن خودشان به کاربر است. این قابلیت در یک زبان برنامه نویسی به صورت یک تابع (Function) بازنمایی یا نشان داده میشود.
به عنوان مثال میتوان این تابع را introduceSelf() نامید. معمولاً از پرانتز باز و بسته خالی در انتهای نام تابع استفاده میشود تا تابع بودن آن مشخص شود. در برنامه نویسی از زبان انگلیسی استفاده میشود. بنابراین، بهتر است آموزش تصویری مفهوم کلاس در برنامه نویسی را با زبان انگلیسی ادامه داد. به این ترتیب، تا اینجا خصوصیتها و قابلیتهای ربات تورج را میتوان به صورت زیر نمایش داد:
در این مقطع، ممکن است این سوال به وجود بیاید که آیا راه آسانی برای سازماندهی این خصوصیتها و توابع وجود دارد؟ بله، میتوان با استفاده از یک شی (Object) این کار را انجام داد.
استفاده از شی برای سازماندهی خصوصیتها و توابع
به بیان ساده، یک شی مجموعهای از خصوصیتها و توابع است. میتوان خصوصیتها را به عنوان متغیر (Variables) ابراز کرد. حال با این مجموعه از اطلاعات (خصوصیتها و توابع)، یک شی میتواند موجودیتی را بازنمایی یا ابراز کند. به بیان سادهتر، یک شی با استفاده از خصوصیتها و توابع، نمایندهای از یک موجودیت است. بنابراین در این مورد خاص، یک شی خاص نماینده یک ربات خاص به نام تورج است.
به همین شکل میتوان شیئی ساخت که نمایندهای از یک شخص خاص، یک سگ خاص یا هر موجودیت خاص دیگری باشد. مثلاً اگر قصد بازنمایی یک شخص خاص با یک شی وجود داشته باشد، این شخص ممکن است مجموعه خصوصیتها (متغیرها) و مجموعه توابع متفاوتی نسبت به رباتهای این مثال داشته باشد. به احتمال زیاد همچنان «نام» به عنوان یکی از متغیرهای شی آن شخص خاص انتخاب میشود. اما، ممکن است خصوصیات دیگری هم مثل قد، رنگ چشم، ملیت و دیگر موارد وجود داشته باشند. همچنین ممکن است شی آن شخص خاص توابع متفاوتی نسبت به رباتهای این مثال برای نمایش فعالیتهایی داشته باشد که آن شخص میتواند انجام دهد. برای مثال این فعالیتها میتوانند کارهایی مثل راه رفتن، خوابیدن، حرف زدن و هر کار دیگری باشند که یک شخص ممکن است انجام دهد.
قرار دادن شی در متغیر
وقتی که یک شی برای بازنمایی یک ربات خاص مثل تورج ایجاد میشود، میتوان این شی را در داخل یک متغیر قرار داد. مثلاً میتوان شی تورج را در متغیری به نام «r1» قرار داد. به این ترتیب میتوان از این متغیر که حاوی مجموعهای از اطلاعات (خصوصیتها و توابع) است، درست مثل هر متغیر دیگری در برنامه نویسی استفاده کرد. مثلاً میتوان این متغیر را به عنوان آرگومان به یک تابع ارجاع داد.
دومین ربات به نام جمشید هم میتواند به همین شکل با یک شی بازنمایی شود. شی جمشید تا حد زیادی مشابه شی تورج خواهد بود. این شی نیز همان مجموعه از خصوصیتها را با مقادیر (ارزشهای) متفاوت خواهد داشت. همچنین توابع استفاده شده برای شی جمشید نیز درست مشابه شی تورج خواهند بود. شی جمشید را هم میتوان در یک متغیر مثلاً با نام «r2» قرار داد.
به دلیل اینکه دو متغیر متمایز وجود دارد که شی متفاوتی در هر کدام از آنها ذخیره شده است، به راحتی میتوان این دو متغیر را در داخل برنامه و کدها تشخیص داد.
مفهوم متغیر نمونه، صفت و متد
در مورد اصطلاحات به کار رفته در برنامه نویسی شی گرا باید گفت، به هر یک از متغیرهای داخل یک شی «متغیر نمونه» (Instance Variable) یا «صفت» (Attribute) گفته میشود. همچنین، به توابع داخل یک شی نیز «متُد» (Method) میگویند:
حال در ادامه به شرح مفهوم کلاس در قالب مثال رباتها پرداخته شده است.
مفهوم کلاس در برنامه نویسی شی گرا
دو شی ربات جمشید و تورج بسیار شبیه به یکدیگر هستند. آنها مجموعه متغیرها و توابعی دقیقاً مشابه یکدیگر دارند. البته در این مثال تنها یک تابع وجود دارد. حال آیا روش مطلوبی برای سازماندهی این اشیا و ایجاد نوعی ساختار برای آنها وجود دارد؟ بله، برای این کار میتوان از یک کلاس (Class) کمک گرفت. پس کلاس چیست؟ کلاس اساساً مثل یک نقشه ساخت (Blueprint) یا طرح اولیه است که از طریق آن میتوان اشیا را ایجاد کرد.
در واقع، برای ساخت هر چیزی در دنیای واقعی نیاز به یک نقشه ساخت وجود دارد. در برنامه نویسی شی گرا نیز برای ساخت اشیا از نقشه ساختی به نام کلاس استفاده میشود. بنابراین، وقتی برنامه نویس یک شی ایجاد میکند، میتواند از یک کلاس برای تعیین صفات و کارکردهای آن شی کمک بگیرد. حال در ادامه بهتر است به کلاس ربات برای جمشید و تورج پرداخته شود. این کلاس را میتوان به صورت زیر نمایش داد:
همانطور که در تصویر فوق ملاحظه میشود، کلاس ربات دارای خصوصیتهای یکسانی با خود اشیا جمشید و تورج است، اما مقادیر این خصوصیتها هنوز تعیین نشدهاند. دلیلش این است که یک کلاس به هیچ شی خاصی اشاره ندارد. یعنی این کلاس به طور خاص به ربات جمشید یا تورج اشاره ندارد، بلکه به کلاس ربات و به طور عمومی به دسته (Category) رباتها اشاره دارد.
وقتی که برنامه نویس یک شی خاصی را با استفاده از این کلاس ایجاد میکند، آنگاه میتوان مشخص کرد که نام ربات چه چیزی باشد، چه رنگی داشته باشد و وزنش چه مقدار باشد. همچنین باید توجه داشت که تابع introduceSelf() در کلاس ربات وجود دارد و میتوان این تابع را در زمان تعریف کلاس با نوشتن کدهایی مشابه کدهای زیر پیادهسازی کرد:
1System.out.println(
2 "My name is " + name
3);
کدهای فوق مثالی از کدنویسی تابع introduceSelf() به زبان جاوا است. در زبان برنامه نویسی جاوا برای چاپ کردن چیزی در خروجی برنامه، از تابع «System.out.println» استفاده میشود. این تابع مشابه Print یا Printf در دیگر زبانهای برنامه نویسی است. در داخل ورودی این تابع، رشته «My name is» به اضافه «name» ارجاع داده شدهاند. name متغیری است که به مقدار صفت نام یک شی خاص اشاره دارد. برای مثال، در صورتی که تابع introduceSelf() در شی تورج اجرا شود، خروجی به صورت زیر خواهد بود:
My name is Tooraj
یک مسئله دیگری که باید در نظر داشت این است که وقتی یک کلاس تعریف میشود، باید آن کلاس را نامگذاری کرد. این نام میتواند هر چیزی باشد. در این مثال خاص، میتوان نام کلاس تعریف شده را «Robot» گذاشت. باید دقت داشت که اولین حرف نام کلاس با حرف بزرگ نوشته میشود. بزرگ بودن حرف اول کلاس یک قرارداد رایج در برنامه نویسی شی گرا است. حال در ادامه شرح مفهوم کلاس در برنامه نویسی شی گرا به مباحث مربوط به کدنویسی کلاس در جاوا، پایتون و سی شارپ پرداخته شده است. پیش از آن، مجموعه دورههای آموزش برنامه نویسی سایت فرادرس به علاقهمندان، دانشجویان و فعالان این حوزه معرفی شده است.
مفهوم کلاس در جاوا
در این بخش از آموزش مفهوم کلاس در برنامه نویسی به شرح کدنویسی کلاس در جاوا پرداخته شده است. کدنویسی کلاس در اکثر زبانهای برنامه نویسی یکسان است و تنها در جزئیات کمی تفاوت دارد. ابتدا فرض میشود که کلاس تعریف و نوشته شده است. پس از تعریف کلاس (با نام فرضی Robot) میتوان از این کلاس برای ایجاد اشیا استفاده کرد.
تعریف شی در جاوا
تعریف یک شی در جاوا به صورت زیر انجام میشود:
1Robot r1 = new Robot();
خط کد فوق بیان میدارد که باید یک شی جدید به نام r1 از کلاس Robot ایجاد شود. در واقع، شی جدید از نوع ربات به متغیر r1 تخصیص داده میشود. باید دقت کرد که از کلمه Robot در خط کد بالا دوبار استفاده شده است. دلیلش این است که یک کلاس نه تنها برای ایجاد یک شی استفاده میشود، بلکه به عنوان یک نوع داده هم به کار میرود. درست مثل وقتی که متغیری از نوع رشتهای به صورت زیر تعریف میشود:
1string Tooraj = "My name is Tooraj";
وقتی که یک شی به این صورت ایجاد میشود، هنوز خصوصیتها یا متغیرهای نمونه این شی تعیین و تنظیم نشده است. لذا باید به صورت زیر آنها را مقداردهی کرد:
1Robot r1 = new Robot();
2r1.name = "Tooraj";
3r1.color = "red";
4r1.weight=30;
در خط دوم کدهای فوق، مقدار «Tooraj» به صفت یا متغیر نمونه name از شی r1 تخصیص داده شده است. و به همین ترتیب، تخصیص مقادیر برای سایر متغیرهای نمونه شی r1 نیز انجام شده است. به همین شکل میتوان شی دیگری را نیز به صورت زیر ایجاد کرد:
1Robot r1 = new Robot();
2r2.name = "Jamshid";
3r2.color = "blue";
4r2.weight=40;
بنابراین، کدنویسی تعریف دو شی رباتی انجام شد که در ابتدای آموزش مفهوم کلاس در برنامه نویسی به صورت انتزاعی معرفی شدند. اما کارکردها و قابلیتهایی که در قالب تابع تعریف میشوند چهطور؟ در مثالی که در ابتدای آموزش مفهوم کلاس در برنامه نویسی زده شد، تابعی به نام introduceSelf() معرفی شد که با اجرای آن در یک شی ربات، آن ربات خودش را معرفی میکند. سینتکس اجرای تابع در شی گرایی بسیار ساده است. برای مثال، اجرای این تابع روی شی r1 در زبان جاوا به صورت زیر انجام میشود:
1r1.introduceSelf();
دستور بالا بیان میدارد که تابع introduceSelf() باید روی شی r1 اجرا شود. بنابراین با اجرای خط کد فوق، خروجی به صورت زیر خواهد بود:
My Name is Tooraj
همین کار را میتوان برای شی r2 نیز به صورت زیر انجام داد:
1r1.introduceSelf();
بنابراین، پس از شرح نحوه تعریف و نمونهسازی اشیا در برنامه نویسی شی گرا و اجرای متدها روی این اشیا، میتوان به سراغ کدنویسی و پیادهسازی مفهوم کلاس در برنامه نویسی رفته و کلاس ربات را تعریف کرد.
تعریف کلاس در جاوا
تعریف کلاس ربات (که پیشتر شرح داده شد) در زبان جاوا به این صورت کدنویسی میشود:
1class Robot {
2 String name;
3 String color;
4 int weight;
5
6
7 void introduceSelf() {
8 System.out.println(
9 "My name is " + this.name);
10 }
11}
تعریف متغیرهای نمونه کلاس در جاوا
در کدهای فوق ملاحظه میشود که ابتدا باید متغیرهای نمونه این کلاس را تعریف کرد. بنابراین، متغیرهای نمونه color ،name و weight به همراه نوع دادهای که دریافت میکنند تعریف شدهاند. در نمونه کدهای جاوا ممکن است از عبارتهای دیگری مثل «public» یا «private» قبل از هر کدام از صفتهای تعریف شده استفاده شده باشد.
به این کلمات کلیدی در شی گرایی تغییر دهنده سطح دسترسی (Access Modifier) گفته میشود. اما، فعلاً در این مقطع از بیان مفهوم کلاس در برنامه نویسی ، پیرامون تغییر دهندههای سطح دسترسی بحث نخواهد شد تا سادگی محتوای آموزشی حفظ شود.
تعریف متد در کلاس جاوا
پس از تعریف متغیرهای نمونه، نوبت به تعریف متدهای یک کلاس میرسد. کدهای جاوا مربوط به تعریف تنها متد کلاس ربات یعنی introduceSelf() به صورت زیر است:
1void introduceSelf() {
2 System.out.println(
3 "My name is " + this.name);
4}
در کدهای فوق تابعی به نام introduceSelf() تعریف شده است. در تعریف این تابع پیشوندی به نام void به کار گرفته شده است. این پیشوند برای این استفاده شده است تا نشان داده شود که این تابع هیچ چیزی را باز نمیگرداند. همچنین باید دقت کرد که تعریف این تابع در داخل کلاس انجام میشود. در مورد پیادهسازی و کدنویسی این تابع پیشتر در بخشهای قبل توضیحات لازم ارائه شده است. البته یک تفاوت کوچک در اینجا وجود دارد و آن هم استفاده از کلمه this در تعریف تابع است که در ادامه باید به شرح چیستی این کلمه کلیدی پرداخته شود.
کلمه کلیدی this در جاوا چیست؟
this به هر شی خاصی اشاره دارد که یک متد کلاس روی آن اجرا خواهد شد. در واقع، کلمه کلیدی this به شی فعلی در یک متد اشاره دارد. رایجترین کاربرد این کلمه کلیدی، از بین بردن سردرگمی در تشخیص صفتهای کلاس و پارامترهایی با نام یکسان است. برای مثال، اگر تابع introduceSelf() با دستور r1.introduceSelf() روی شی r1 اجرا شود، کلمه کلیدی this در داخل متد introduceSelf() به شی r1 اشاره خواهد داشت. بنابراین، در واقع خط آخر تعریف تابع introduceSelf() به صورت زیر در میآید:
1"My name is " + r1.name);
بنابراین، تا اینجا مقدمات آموزش مفهوم کلاس در برنامه نویسی شی گرا به زبان جاوا شرح داده شده است. اما، با دقت به دو قطعه کد مربوط به تعریف دو شی جمشید و تورج، ممکن است این کدها بسیار تکراری به نظر برسند. چرا که، کدهای تقریباً یکسانی باید تکرار شوند و همچنین احتمالاً به خاطر سپردن صفتها در هر بار تعریف یک شی میتواند کار دشواری باشد. آیا راهی برای سادهسازی این کدها وجود دارد؟ بله، این کار از طریق یک سازنده (Constructor) انجام میشود.
سازنده در جاوا
سازنده به تابعی گفته میشود که میتوان با استفاده از آن یک شی را از یک کلاس ایجاد کرد و برنامه نویس میتواند از سازنده برای تنظیم صفتها استفاده کند. در واقع، پیش از این و در ایجاد دو شی جمشید و تورج نیز از سازنده استفاده شده است.
در همان خط اول تعریف شی، عبارت «new Robot()» یک سازنده است. اما این سازنده پیشفرضی است که جاوا برای شی تعریف میکند. این سازنده پیشفرض هیچ صفتی را تنظیم نمیکند.
تعریف سازنده در جاوا
حال در ادامه، نحوه ایجاد سازندهای شرح داده شده است که صفتها را هم برای برنامه نویس تنظیم میکند. مثلا، یک سازنده به صورت زیر کدنویسی میشود:
1Robot(String n, String c, int w) {
2 this.name = n;
3 this.color = c;
4 this.weight = w;
5}
سازنده فوق در داخل کلاس تعریف میشود. بنابراین، تمام کدهای مربوط به تعریف کلاس ربات شامل صفتها، سازنده و متد آن به صورت زیر است:
1class Robot {
2 String name;
3 String color;
4 int weight;
5
6 Robot(String n, String c, int w) {
7 this.name = n;
8 this.color = c;
9 this.weight = w;
10}
11
12 void introduceSelf() {
13 System.out.println(
14 "My name is " + this.name);
15 }
16}
سازنده چیزی شبیه به یک تابع است، با این تفاوت که هیچ پیشوندی مثل void یا string برای مقدار بازگشتی در ابتدای نام آن وجود ندارد.
همچنین، قابل توجه است که نام این سازنده دقیقاً با نام کلاس یکسان است. سازنده فوق سه آرگومان ورودی دارد و در داخل تابع سازنده آرگومانهای ورودی به صفتها (متغیرهای نمونه) شی تخصیص داده میشوند. همانطور که پیشتر نیز شرح داده شد، کلمه کلیدی «this» به آن شی خاصی اشاره دارد که سازنده برای تعریف آن فراخوانی شده است. بنابراین، با تعریف یک سازنده در کلاس، میتوان با کدنویسی کمتر و سرعت بیشتری یک شی جدید را تعریف و صفتهای آن شی را تنظیم کرد. حال در ادامه نحوه استفاده از سازنده شرح داده شده است.
استفاده از سازنده برای تعریف شی در جاوا
برای مثال، تعریف شی ربات تورج با استفاده از سازنده در جاوا به صورت زیر کدنویسی میشود:
1Robot r1 =
2 new Robot("Tooraj","red",30);
با تعریف شی تورج با استفاده از سازنده Robot، این شی به سازنده تعریف شده در داخل کلاس Robot ارجاع داده میشود و قطعه کد داخل تابع سازنده در کلاس اجرا خواهد شد. به این ترتیب، آرگومانهای ورودی سازنده به صفتهای شی تخصیص داده میشوند. بنابراین، با استفاده از سازنده تعریف شی سادهتر و کدنویسی آن کوتاهتر میشود. به طور مشابه، تعریف شی ربات جمشید نیز به صورت زیر انجام میشود:
1Robot r1 =
2 new Robot("Jamshid","blue",40);
به این ترتیب، مفهوم کلاس در برنامه نویسی شی گرا بر بستر جاوا و با ذکر مثال شرح داده شد. فرآیند کدنویسی و پیادهسازی مفهوم کلاس در برنامه نویسی شی گرا با استفاده از دیگر زبانهای برنامه نویسی نیز مشابه زبان جاوا انجام میشود. در سطح پیشرفتهتری از آموزش مفهوم کلاس در برنامه نویسی شی گرا ، نحوه تعامل چند کلاس و شی با یکدیگر مطرح میشود که با استفاده از این مهارت، میتوان شروع به ایجاد ساختمانهای دادههایی مثل لیستهای پیوندی کرد. بنابراین، ادامه آموزش مفهوم کلاس در برنامه نویسی ، به شرح نحوه تعامل چند کلاس و شی با یکدیگر در جاوا اختصاص دارد.
تعامل اشیا و کلاسها در جاوا
تا اینجا، کلاسی به نام Robot با سه صفت نام، رنگ و وزن ایجاد شد.
همچنین، این کلاس تنها یک متد دارد که در صورت اجرای آن، یک جمله در خروجی چاپ میشود و شی ربات خود را معرفی میکند:
سپس دو شی از کلاس Robot ایجاد شد. اولین شی در متغیر R1 و دومین شی در متغیر r2 قرار داده شدند.
حال برای ادامه آموزش مباحث مربوط به مفهوم کلاس در برنامه نویسی شی گرا و پیادهسازی نحوه تعامل اشیا و کلاسها با یکدیگر، نیاز به تعریف کلاس دیگری وجود وجود دارد که در قالب مثال رباتها، نام این کلاس Person گذاشته شده است.
تعریف کلاس Person
علاوه بر آن، برای این بخش از آموزش مفهوم کلاس در برنامه نویسی ، کلاس دیگری به نام Person جهت بازنمایی یک شخص تعریف میشود. کلاس Person سه صفت دارد. این سه صفت شامل name و personality از نوع رشتهای و isSitting از نوع دودویی است. صفت isSitting تنها میتواند دو مقدار True یا False را داشته باشد. در صورتی که مقدار این صفت True باشد، یعنی آن شخص خاص در حالت نشسته قرار دارد.
تعریف متدهای کلاس Person
همچنین، کلاس Person دارای دو متد با نامهای sitDown() و standUp() است. تابع sitDown() مقدار متغیر isSitting را به True تغییر میدهد و تابع standUp() نیز مقدار این متغیر را به False تغییر خواهد داد. واضح است که در صورت True بودن متغیر isSitting در یک شی، با اجرای تابع sitDown() مقدار آن تغییری نخواهد کرد. به همین شکل، تابع standUp() نیز همان کار تابع sitDown() را به صورت وارونه انجام میدهد.
با استفاده از این کلاس نیز میتوان چند شی ایجاد کرد. مثلاً دو شخص با نامهای آلیس و بهار به عنوان اشیایی از کلاس Person تعریف میشوند:
حالا این مسئله مطرح میشود که چهطور میتوان امکان تعامل اشیا از کلاسهای متفاوت را با یکدیگر به وجود آورد؟ یعنی در اینجا اشیا آلیس و بهار از کلاس Person چهطور میتوانند با اشیا جمشید و تورج از کلاس Robot در تعامل باشند؟ اصلاً در چه شرایطی ممکن است نیاز به تعامل اشیا و کلاسهای مختلف به وجود بیاید؟ در ادامه این بخش از آموزش مفهوم کلاس در برنامه نویسی شی گرا ، به این سوالات پاسخ داده شده است.
تعامل اشیا از کلاسهای متفاوت در جاوا
یکی از شرایطی که ممکن است در آن نیاز به تعامل اشیا کلاسهای مختلف با یکدیگر به وجود بیاید، مثلاً میتواند در حالتی رخ دهد که یک شخص خاص صاحب یک ربات خاص باشد. میتوان فرض کرد که بهار (از کلاس Person) صاحب ربات تورج (از کلاس Robot) و شی دیگر کلاس Person به نام آلیس، صاحب ربات جمشید باشد. حال چهطور میتوان این مفهوم را در برنامه نویسی شی گرا ابراز و بیان کرد؟
تعریف صفت جدید برای ایجاد تعامل بین کلاسها
یک راه برای نشان دادن مفهوم مالکیت در این مثال، به این صورت است که یک صفت دیگر در کلاس Person تعریف شود. مثلاً میتوان نام این صفت را «robotOwned» به معنی «ربات تحت مالکیت» گذاشت. مقدار صفت robotOwned نام شی رباتی (از کلاس Robot) خواهد بود که آن شخص خاص (شی خاص از کلاس Person) قرار است مالک آن باشد. مثلاً، برای نشان دادن اینکه ربات r2 متعلق به شخص p1 است، در تعریف شی p1، متغیر robotOwned باید به صورت زیر با r2 مقداردهی شود:
به همین شکل، میتوان با استفاده از مقداردهی متغیر robotOwned در شی p2 نیز مالکیت ربات r1 را به آن نسبت داد. این یک روش رایج برای ابراز و نمایش رابطه میان اشیا و کلاسهای متفاوت با یکدیگر است. حال در ادامه نحوه پیادهسازی تعامل میان اشیا کلاسهای مختلف با استفاده از تعریف صفت جدید در قالب کدهای زبان جاوا آموزش داده شده است.
کدنویسی تعامل کلاسهای مختلف با استفاده از تعریف صفت جدید در جاوا
در این بخش از آموزش مفهوم کلاس در برنامه نویسی شی گرا ، نحوه کدنویسی تعامل اشیا کلاسهای مختلف در زبان جاوا شرح داده شده است. نحوه کدنویسی این مفاهیم در سایر زبانها نیز تا حد زیادی مشابه زبان جاوا است و تفاوت چندانی ندارد. ابتدا باید کدنویسی کلاس Person را انجام داد. کدهای مربوط به کلاس Person به صورت زیر است:
1class Person {
2 String name;
3 String personality;
4 boolean isSitting;
5 Robot robotOwned;
6
7 Person(String n, String p, boolean i) {
8 this.name = n;
9 this.personality = p;
10 this.isSitting = i;
11 }
12 void sitDown() {
13 this.isSitting = true; }
14 void standUp() {
15 this.isSitting = false; }
16}
همانطور که در کدهای فوق ملاحظه میشود، صفت robotOwned از نوع Robot است. زیرا این متغیر یا صفت، با یک شی ربات مقداردهی خواهد شد. همچنین ملاحظه میشود که در کلاس Person سازندهای با همین نام تعریف شده است. سازنده Person سه آرگومان ورودی دارد که مقادیر صفتهای نام، شخصیت و وضعیت نشستن شی Person را تنظیم میکنند. در نهایت، دو متد sitDown() و standUp() نیز در کلاس Person تعریف شدهاند.
ایجاد شی از کلاس Person
حال با تعریف کلاس Person میتوان یک شی از این کلاس ایجاد کرد. ایجاد شی آلیس در زبان جاوا با استفاده از سازنده به صورت زیر کدنویسی میشود:
1Person p1 = new Person("Alice", "aggressive", false);
به طور مشابه، کد مربوط به ایجاد شی p2 با نام بهار از کلاس Person به صورت زیر است:
1Person p2 = new Person("Bahar", "talkative", true);
حالا برای نشان دادن اینکه شخص p1 صاحب ربات r2 است، باید به صورت عمل کرد:
1p1.robotOwned = r2
به همین ترتیب، برای نشان دادن اینکه شخص p2 صاحب ربات r1 است، باید خط کد زیر را نوشت:
1p1.robotOwned = r2
برای اجرای این کدها میتوان آنها را در فایلی با نام فرضی «TestRobotAndPerson.java» ذخیره کرد. حال میتوان کدهایی به صورت زیر نوشت:
1p1.robotOwned.introduceSelf();
به بیان ساده، اتفاقی که در خط کد فوق رخ داده به این صورت است که «p1.robotOwned» همان شی r2 را بازمیگرداند. زیرا ربات r2 تحت مالکیت شخص p1 است. بنابراین، خط کد فوق دقیقاً با خط زیر یکسان است:
1r2.introduceSelf();
خروجی هر دو خط کد بالا به صورت زیر است:
My name is Jamshid
بنابراین، نحوه ابراز و نمایش روابط میان دو شی از کلاسهای مختلف (Person و Robot) با استفاده از تعریف صفت شرح داده شد. آیا میتوان کار مشابهی را در محدوده یک کلاس انجام داد؟ به عنوان مثال، آیا میتوان چند شی در کلاس ربات تعریف کرد که هر یک از آنها با دیگری رابطه دوستی داشته باشند؟ یا اینکه آیا میتوان نشان داد که یک ربات در حال نگاه کردن به ربات دیگر است؟ در ادامه آموزش مفهوم کلاس در برنامه نویسی شی گرا به این سوال پاسخ داده شده است.
پیادهسازی مفهوم رابطه میان اشیا یک کلاس در جاوا
در این بخش از آموزش مفهوم کلاس در برنامه نویسی شی گرا ، نحوه پیادهسازی روابط میان اشیائی از یک کلاس با استفاده از مثال رباتها شرح داده شده است. فرض میشود قصد پیادهسازی مفهوم نگاه کردن رباتها به یکدیگر وجود دارد.
برای پیادهسازی این مفهوم تنها کافی است که یک صفت جدید به کلاس Robot اضافه شود. این صفت از نوع Robot خواهد بود و میتوان نام آن را lookingAt گذاشت. این صفت به بخش تعریف صفتهای کلاس ربات اضافه میشود:
1class Robot {
2 String name;
3 String color;
4 int weight;
5 Robot lookingAt
6
7 Robot(String n, String c, int w) {
8 this.name = n;
9 this.color = c;
10 this.weight = w;
11}
12
13 void introduceSelf() {
14 System.out.println(
15 "My name is " + this.name);
16 }
17}
حالا، مثلاً برای نشان دادن اینکه ربات r1 در حال نگاه کردن به ربات r2 است، میتوان از کد زیر استفاده کرد:
1r1.lookingAt = r2
خط کد بالا، شی r2 را به صفت lookingAt در شی r1 تخصیص میدهد. این یک مثال بسیار ساده و ابتدایی است و حتی ممکن است این ایده که چند ربات به یکدیگر نگاه میکنند، تا حدودی احمقانه به نظر برسد. اما میتوان از این ایده برای پیادهسازی مفاهیم واقعگرایانهتر استفاده کرد. برای مثال در صورتی که قصد پیادهسازی یک شبکه اجتماعی مثل توییتر یا اینستاگرام وجود داشته باشد، میتوان رباتها را حسابهای کاربری در نظر گرفت و این مفهوم را پیادهسازی کرد که مثلاً این حساب کاربری در حال دنبال کردن یک حساب کاربری دیگر است. بنابراین، شرح مفهوم کلاس در برنامه نویسی شی گرا و سایر مفاهیم مرتبط با آن با استفاده از یک مثال عینی و پیادهسازی این مفاهیم در زبان برنامه نویسی جاوا انجام شد. حال در ادامه این مقاله به شرح مفهوم کلاس در پایتون و مسائل پیرامون آن پرداخته شده است.
مفهوم کلاس در پایتون
در تصویر فوق تعدادی ساعت رومیزی متفاوت وجود دارد. این ساعتها دارای اشکال، رنگها و اندازههای متفاوتی هستند. اما، همه آنها نوعی ساعت به حساب میآیند. مفهوم کلاس در برنامه نویسی و زبان پایتون نیز به همین شکل است. یک کلاس نمایندهای از یک نوع خاص مثل ساعت است و میتوان نمونههای (Instance) بسیاری را از این نوع خاص، مثل انواع ساعت در تصویر فوق، ایجاد کرد.
الگوی برنامه نویسی شی گرا (Object Oriented Programming | OOP) پیرامون این ایده بنا نهاده شده است که اشیا به یک نوع خاص تعلق دارند. به یک معنا، نوع آن چیزی است که شی را توصیف و تشریح میکند. توصیف یک شی برای درک مفهوم کلاس در برنامه نویسی شی گرا بسیار اهمیت دارد. در این راستا، لازم است درک همه جانبهای نسبت به موارد زیر وجود داشته باشد:
- بازنمودی که یک شی ارائه میدهد
- نوع داده ذخیره شده در یک شی
- نحوه تعامل با شی
- نحوه پیادهسازی شی به صورت کد
تمام موارد تشکیل دهنده توصیف و تشریح یک شی که در بالا فهرست شدهاند، با مفهوم کلاس در برنامه نویسی پیوند دارند. همه چیز در پایتون شیئی از یک نوع به حساب میآید. این نوع میتواند نوع داده عددی، لیست، دیکشنری، تابع و دیگر موارد باشد. یک نوع از شی با استفاده از کلاسها تعریف میشود. در بخش مفهوم کلاس در پایتون ، نکات لازم پیرامون مفهوم کلاس در برنامه نویسی ، نحوه ایجاد یک کلاس در پایتون و مزایای استفاده از کلاسها بیان شده است.
مفهوم کلاس در پایتون چیست؟
کلاسها در پایتون نیز شامل اطلاعات زیر هستند:
- صفتهای داده: آنچه برای ایجاد نمونهای از یک کلاس مورد نیاز است.
- متدها: نحوه تعامل با نمونههای یک کلاس
مزایای بسیاری در استفاده از کلاسهای پایتون و سایر زبانهای شی گرا وجود دارد که در حین پرداختن به مفهوم کلاس در پایتون به آنها اشاره شده است. از کلاسهای پایتون در مواقع بسیاری استفاده میشود. برای مثال، وقتی که یک لیست در پایتون ایجاد میشود، در واقع یک نمونه (شی) از نوع (کلاس) لیست ساخته شده است:
1words = ['data', 'science', 'machine', 'learning']
در اینجا هدف آموزش نحوه ایجاد یک لیست در پایتون نیست. اما باید نحوه تعامل با لیستها و استفاده بهینه از آنها در کدنویسی پایتون فرا گرفته شود. این همان ایده انتزاع است. برای مثال، میتوان یک آیتم را به وسیله متد remove از یک لیست حذف کرد:
1words.remove('data')
2print(words)
3['science', 'machine', 'learning']
بنابراین، متد remove در کلاس List پایتون درست مثل متد sitDown یا standUp در کلاس Person عمل میکند که در بخش آموزش مفهوم کلاس در جاوا تعریف شدند. آموزش ایجاد کلاس در پایتون در ادامه ارائه شده است.
آموزش ایجاد کلاس در پایتون
برای مثال، ایجاد یک کلاس به نام Book در پایتون به صورت زیر انجام میشود:
1class Book():
2 def __init__(self, name, writer, word_length):
3 self.name = name
4 self.writer = writer
5 self.word_length = word_length
«__init__» یک تابع مخصوص است که در زمان ایجاد نمونهای از یک کلاس به طور خودکار اجرا میشود. این تابع همان سازنده (Constructor) کلاس است که در بخشهای قبلی شرح داده شد. پارامترهای تابع init نمایندهای از صفتهای یک کلاس هستند. کلمه کلیدی Self در پایتون درست مثل کلمه کلیدی this در جاوا به آن نمونه خاص از کلاس یا همان شی خاص اشاره دارد. در پایتون میتوان از هر کلمه دیگری هم به جای Self استفاده کرد، اما استفاده از این کلمه کلیدی اکیداً توصیه میشود.
ایجاد یک نمونه از کلاس در پایتون
برای نمایش نحوه ایجاد یک شی یا همان نمونهای از یک کلاس در پایتون ، از کلاس Book استفاده شده است. این کلاس در بخش قبلی تعریف شد. کدهای ایجاد نمونهای از کلاس Book به صورت زیر است:
1b1 = Book("Pandas", "John Doe", 100000)
2print(type(b1))
3<class '__main__.Book'>
در کدهای فوق، b1 شیئی است که به کلاس Book تعلق دارد. میتوان این حقیقت را با استفاده از تابع type تایید کرد. تابع type در پایتون نوع یک شی را باز میگرداند. به طریق زیر میتوان به صفتهای یک کلاس دسترسی پیدا کرد و آنها را تغییر داد:
1print(b1.name)
2Pandas
3b1.name = 'NumPy' #updates the name attribute
4print(b1.name)
5NumPy
تعریف متدهای کلاس در پایتون
در این بخش از آموزش مفهوم کلاس در پایتون ، متدهایی به کلاس Book اضافه میشوند تا این کلاس به کلاسی کاربردی و عملکردگرا تبدیل شود. به متدهای کلاس «صفتهای رویهای» (Procedural Attributes) هم گفته میشود.
برای مثال، میتوان متدی را در کلاس Book پیادهسازی کرد که با دریافت اندازه فونت، تعداد صفحات را باز گرداند. اندازه یا طول کتاب با تعداد کلمات آن مشخص شده است. متد زیر تعداد صفحات را بر اساس طول و اندازه فونت محاسبه میکند:
1def number_of_pages(self, fontsize=12):
2 word_length = self.word_length
3 if fontsize == 12:
4 words_in_page = 300
5 else:
6 words_in_page = 300 - (fontsize - 12) * 10
7 return round(word_length / words_in_page)
باید متد «number_of_pages» که تعریف آن در کدهای فوق آمده است را به کدهای تعریف کلاس اضافه کرد. همانطور که بیان شد، این متد تعداد صفحات یک کتاب را بر اساس تعداد کلمات و اندازه فونت محاسبه میکند. در صورتی متد تعریف شده در داخل تعریف کلاس نیاز به دسترسی به صفتهای یک شی داشته باشد، باید نحوه دسترسی به آنها را برای تابع مشخص کرد. این کاری است که در سطر اول متد number_of_pages انجام شده است. میتوان از طریق کلاس یا شی به متد دسترسی داشت. در ادامه، مثالی برای نشان دادن این مسئله آمده است:
1b1 = Book("Pandas", "John Doe", 100000)
2b1.number_of_pages()
3333
4Book.number_of_pages(b1)
5333
در کدهای فوق، متد number_of_pages ابتدا از طریق شی b1 فراخوانی شده و سپس در خط بعد، این متد با استفاده از کلاس Book فراخوانی و شی b1 به عنوان آرگومان به آن ارجاع شده است. خروجی هر یک از این خطوط در ذیل آن آمده است. تابع number_of_pages دارای یک پارامتر اضافی به نام fontsize است. اما چون یک مقدار پیشفرض (۱۲) به آن تخصیص داده شده است، حتماً لازم نیست مقدار آن مشخص شود. اگرچه، میتوان به صورت زیر از یک مقدار متفاوت برای پارامتر اندازه فونت استفاده کرد:
1b1.number_of_pages(14)
2357
3b1.number_of_pages(fontsize=16)
4385
همانطور که در کدهای فوق ملاحظه میشود، با افزایش اندازه فونت، تعداد صفحات نیز افزایش پیدا میکند که امری منطقی است. برای استفاده از برخی توابع داخلی و پیشساخته پایتون متدهای خاصی وجود دارد که باید برای کلاس تعریف شوند. برای مثال میتوان تابع Print را در نظر گرفت:
1print(b1)
2<__main__.Book object at 0x7fa4cf9f7588>
به صورت پیشفرض، تابع Print در پایتون ، نوع و نشانی حافظه یک شی را باز میگرداند. اگرچه میتوان رفتار آن را با پیادهسازی متد «__str__» در کلاس شخصیسازی کرد:
1def __str__(self):
2 return "<" + self.name + ", by " + self.writer + ">"
کدهای فوق مربوط به متد «__str__» است که باید آن را به کلاس اضافه کرد. اکنون خروجی تابع Print برای کلاس تغییر کرده و به صورت زیر است:
1print(b1)
2<Pandas, by John Doe>
مقایسه متغیرهای کلاس و متغیرهای نمونه در پایتون
متغیرهای کلاس در داخل یک کلاس اما خارج از توابع تعریف میشوند. متغیرهای نمونه در داخل سازنده (همان متد __init__) تعریف میشوند. متغیرهای کلاس عمومیتر هستند و احتمالاً در تمام نمونههای یک کلاس (اشیا) به کار گرفته میشوند. از طرف دیگر، متغیرهای نمونه خاصتر هستند و برای هر شی به طور مجزا تعریف میشوند. تشخیص متغیرهای کلاس از متغیرهای نمونه بسیار مفید است.
برای مثال میتوان کلاس Book را در نظر گرفت که پیشتر تعریف شد. بر فرض در یک شرکت نشر، استانداردهایی مثل عرض صفحه و رنگ جلد برای همه کتابهای منتشر شده وجود دارد. در صورتی که این استانداردها را به عنوان متغیرهای کلاس تعریف کنیم، دیگر نیازی به تعریف آنها به صورت موردی در هر شی ایجاد شده نخواهد بود.
1class Book():
2 page_width = 14
3 cover_color = "blue"
4 def __init__(self, name, writer, word_length):
5 self.name = name
6 self.writer = writer
7 self.word_length = word_length
در کدهای فوق، «page_width» و «cover_color» به عنوان متغیرهای کلاس پیادهسازی شدهاند. همانطور که ملاحظه میشود، این متغیرها در داخل تعریف کلاس و خارج از تعریفهای توابع ایجاد شدهاند. حال برای بیان یک نکته، یک بار دیگر کلاس Book نمونهسازی شده و شیئی از آن ایجاد شده است:
1b2 = Book("Machine Learning", "Jane Doe", 120000)
همانطور که ملاحظه میشود، در شی ایجاد شده فوق، متغیرهای کلاس مقداردهی نشدهاند. اگرچه، شی b2 این متغیرها را در خود دارد و به صورت زیر میتوان به آنها دسترسی داشت:
1b2.page_width
214
3b2.cover_color
4'blue'
همچنین، میتوان این متغیرهای کلاس را برای یک شی خاص تغییر داد:
1b2.cover_color = 'red'
2b2.cover_color
3'red'
تغییرات اعمال شده روی یک شی خاص، هیچ تاثیری روی متغیر کلاس نخواهند داشت:
1Book.cover_color
2'blue'
ایجاد یک کلاس فرزند در پایتون | مفهوم ارثبری در شی گرایی
میتوان در پایتون و اکثر زبانهای برنامه نویسی شی گرا کلاسی بر اساس یک کلاس دیگر ایجاد کرد. برای مثال، در ادامه، کلاسی به نام «ColorBook» بر اساس کلاس Book ایجاد شده است.
1class ColorBook(Book):
کلاس ColorBook یک کلاس فرزند از کلاس Book است. زمانی که کلاسی از این طریق ایجاد میشود، کلاس فرزند صفتها (هم صفتهای داده و هم صفتهای رویهای) را از کلاس والد کپی میکند. به این مفهوم، ارثبری گفته میشود. ارثبری یکی از ستونها و خصوصیتهای اصلی برنامه نویسی شی گرا محسوب میشود و OOP را قدرتمندتر و کارآمدتر میکند. ارثبری مشابه مفهوم آن در زندگی واقعی است. اکثر ترکیبات ژنتیکی افراد برگرفته شده از والدین و نیاکان آنها است و از آنان به ارث برده میشود. بنابراین، شباهتهای زیادی بین افراد و والدینشان وجود دارد.
یک کلاس فرزند میتواند علاوه برای صفاتی که به ارث برده، صفات جدید هم داشته باشد. علاوه بر آن، میتوان صفتهای به ارث برده شده را رونویسی (Override) کرده و تغییر داد یا باطل کرد. در ادامه، تابع __init__ (سازنده) مربوط به کلاس ColorBook تعریف شده است. برای این تابع، دو پارامتر افزوده (نسبت به کلاس Book) ایجاد شده است. این پارامترها شامل «color» و «has_image» است. پارامتر color رنگ صفحات را مشخص میکند و has_image تعیین میکند که آیا تصویری در کتاب وجود دارد یا خیر.
1class ColorBook(Book):
2 def __init__(self, name, writer, word_length, color, has_image):
3 Book.__init__(self, name, writer, word_length
4 self.color = color
5 self.has_image = has_image
در کدهای فوق، چون صفتهای writer ،name و word_length از پیش در کلاس Book تعریف شدهاند، میتوان تنها متد __init__ را از کلاس Book کپی کرد. تنها لازم است صفتهای افزوده (جدید) را تعریف کرد. به راحتی میتوان همه صفتهای داده را به طور دستی برای کلاس فرزند تعریف کرد و استفاده از سازنده (__init__) کلاس والد اختیاری است. در ادامه، شیئی از کلاس ColorBook ایجاد شده است:
1c1 = ColorBook("Seaborn", "John Doe", 90000, "green", True)
2c1.name
3"Seaborn"
4c1.color
5"green"
همچنین، کلاس فرزند متغیرهای کلاس والد را هم به ارث میبرد:
1c1.cover_color
2"blue"
3c1.page_width
414
علاوه بر آن، متدها نیز از کلاس والد کپی میشوند. برای کلاس Book، دو متد تعریف شده است. از این متدها میتوان در اشیا کلاس ColorBook نیز استفاده کرد.
1c1.number_of_pages()
2300
3print(c1)
4<Seaborn, by John Doe>
این انتخاب وجود دارد که صفتهای داده و صفتهای رویهای (همان متدهای) به ارث برده شده از کلاس والد را بازنویسی کرده و تغییر داد. این امکان، قابلیت ارثبری را حتی قدرتمندتر هم میکند، زیرا برنامهنویس ناچار به استفاده عینی از همه اجزای تعریف شده در کلاس والد نخواهد بود. برای نمونه، میتوان متد __str__ را برای کلاس ColorBook ویرایش کرد و تغییر داد:
1def __str__(self):
2 return "<" + self.name + ", in " + self.color + ">"
به این ترتیب، تابع print نام کتاب و رنگ آن را باز میگرداند:
1c1 = ColorBook("Seaborn", "John Doe", 90000, "green", True)
2print(c1)
3<Seaborn, in green>
حال در ادامه تعریف کلاسهای Book و ColorBook به طور کامل و یکجا همراه با متدها در تصاویر زیر آمده است:
بنابراین، در این بخش از مقاله آموزش مفهوم کلاس در برنامه نویسی ، معرفی همهجانبهای از کلاسهای پایتون ارائه و مفهوم کلاس در پایتون پوشش داده شد. در این بخش به اهمیت کلاسها در برنامه نویسی شی گرا اشاره شد و به این مسئله پرداخته شد که کلاسها چگونه مفاهیم کلیدی نظیر انتزاع و ارثبری را بروز میدهند. برای آموزش عملی، دو کلاس مختلف تعریف شدند و چگونگی عملکرد ارثبری در یک کلاس فرزند نشان داده شد. به این ترتیب، با استفاده از آموزشهای ارائه شده در این مقاله، مباحث پایه پیرامون مفهوم کلاس در پایتون فرا گرفته شده است و میتوان وارد مباحث پیشرفتهتر در این حوزه شد.
مفهوم کلاس در سی شارپ
در این بخش از مقاله آموزش مفهوم کلاس در برنامه نویسی شی گرا ، مفهوم کلاس در سی شارپ شرح داده و مثالهایی برای نحوه کدنویسی تعریف کلاس ارائه شده است.
یک کلاس در سی شارپ نیز همانند سایر زبانهای برنامه نویسی شی گرا نقشه ساختی از یک شی خاص است. در زبان برنامه نویسی سی شارپ (C#) یک کلاس میتواند با استفاده از کلمه کلیدی «Class» به صورت زیر تعریف شود:
1public class MyClass
2{
3 public string myField = string.Empty;
4
5 public MyClass()
6 {
7 }
8
9 public void MyMethod(int parameter1, string parameter2)
10 {
11 Console.WriteLine("First Parameter {0}, second parameter {1}",
12 parameter1, parameter2);
13 }
14
15 public int MyAutoImplementedProperty { get; set; }
16
17 private int myPropertyVar;
18
19 public int MyProperty
20 {
21 get { return myPropertyVar; }
22 set { myPropertyVar = value; }
23 }
24}
در تصویر زیر، بخشها و بلوکهای تشکیل دهنده مفهوم کلاس در سی شارپ مشخص شدهاند:
حال در ادامه، هر یک از این اجزا شرح داده شدهاند.
تعیین کننده سطح دسترسی در سی شارپ
تعیین کنندههای سطح دسترسی (Access Modifiers) به تعریف کلاس، متد، خصوصیتها، فیلدها و سایر اعضا اعمال میشوند.
این تعیین کنندههای سطح دسترسی، دسترسپذیری کلاس و اعضای آن را تعریف میکنند. در سی شارپ ، تعیینکنندههای سطح دسترسی به شرح زیر است:
- Public
- Private
- Protected
- Internal
در ادامه و در بخش کلمات کلیدی در مورد آن بحث خواهد شد.
فیلد در سی شارپ چیست؟
فیلد (Field) یک متغیر سطح کلاسی است که مقداری را نگهداری میکند. به طور کلی، اعضای فیلد باید تعیین کنندههای سطح دسترسی از نوع خصوصی داشته باشند و با خصوصیتها (Property) استفاده شوند.
سازنده در سی شارپ
یک کلاس میتواند سازندههای دارای پارامتر و سازندههای بدون پارامتر داشته باشد. سازنده زمانی فراخوانی میشود که نمونهای از یک کلاس (یک شی) ایجاد میشود. یک سازنده در سی شارپ با استفاده از یک تعیین کننده سطح دسترسی و نام کلاس تعریف میشود:
1<access modifiers> <class name>(){ }
برای مثال، یک سازنده در کلاس MyClass در قطعه کد زیر تعریف شده است:
1class MyClass
2{
3 public MyClass()
4 {
5
6 }
7}
متد در سی شارپ
یک متد در سی شارپ میتواند با استفاده از قالبهای زیر تعریف شود:
{access modifier} {return type} MethodName({parameterType parameterName})
برای مثال، متدی با نام MyMethod در ادامه تعریف شده است:
1public void MyMethod(int parameter1, string parameter2)
2{
3 // write your method code here..
4
5}
Property در سی شارپ
میتوان یک Property یا خصوصیت را در سی شارپ با استفاده از دریافت کننده یا Getterها و تنظیم کنندهها یا Setterها به صورت زیر تعریف کرد:
1private int _myPropertyVar;
2
3public int MyProperty
4{
5 get { return _myPropertyVar; }
6 set { _myPropertyVar = value; }
7}
Property در سی شارپ یک فیلد خصوصی را در خود کپسوله میکند. خصوصیت، Getterهایی (get{}) را برای بازیابی مقدار فیلد ضمنی فراهم میکند. همچنین، یک خصوصیت، Setterهایی (set{}) را برای تنظیم مقدار فیلد ضمنی ارائه میدهد. در مثال فوق، _myPropertyVar یک فیلد خصوصی است که نمیتوان به طور مستقیم به آن دسترسی داشت.
این فیلد تنها از طریق MyProperty قابل دسترسی خواهد بود. بنابراین، MyProperty فیلد خصوصی _myPropertyVar را در خود کپسوله میکند. همچنین، مطابق مثال زیر، میتوان منطق بیشتری را هم در get و set اعمال کرد:
1private int _myPropertyVar;
2
3public int MyProperty
4{
5 get {
6 return _myPropertyVar / 2;
7 }
8
9 set {
10 if (value > 100)
11 _myPropertyVar = 100;
12 else
13 _myPropertyVar = value; ;
14 }
15}
Property پیادهسازی شده به صورت خودکار در سی شارپ
از سی شارپ نسخه سه به بعد، در صورتی که برنامه نویس قصد اعمال منطق خاصی را در get و set نداشته باشد، میتوان از Propertyهای پیادهسازی شده به صورت خودکار استفاده کرد. خط کد زیر مثالی از تعریف یک خصوصیت پیادهسازی شده به صورت خودکار است:
1public int MyAutoImplementedProperty { get; set; }
باید توجه داشت که هیچ فیلد پشتیبانی خصوصی در مثال Property فوق وجود ندارد. فیلد پشتیبانی به صورت خودکار توسط کامپایلر ایجاد خواهد شد. میتوان با یک خصوصیت پیادهسازی شده به صورت خودکار درست مثل یک خصوصیت معمولی در یک کلاس کار کرد. خصوصیت پیادهسازی شده به صورت خودکار تنها برای تعریف آسان خصوصیت در زمانی به کار میروند که هیچ منطق افزودهای در دستیابندههای خصوصیت مورد نیاز نیست.
فضای نام در سی شارپ
فضای نام (Namespace) یک نگهدارنده (Container) برای مجموعهای از کلاسهای مرتبط و فضاهای نام است. کلاس نگهدارنده کلاسی است که برای نگهداری اشیا در حافظه یا حافظه خارجی استفاده میشود. فضای نام جهت فراهم کردن راهی برای جداسازی یک مجموعه نامها از مجموعه نامهای دیگر طراحی شده است.
همچنین از فضای نام برای تخصیص نامهای خاص به کلاسها در داخل نام فضای نام استفاده میشود. فضاهای نام و کلاسها را میتوان با استفاده از یک نقطه نمایش داد. در سی شارپ، میتوان با استفاده از کلمه کلیدی «namespace» فضای نام تعریف کرد:
1namespace CSharpTutorials
2{
3 class MyClass
4 {
5
6 }
7}
در مثال فوق، «CSharpTutorials.MyClass» نام کاملاً واجد شرایط نام کلاس MyClass است. یک فضای نام میتواند شامل فضای نامهای دیگری باشدو فضای نامهای داخلی را میتوان با استفاده از نقطه جداسازی کرد:
1namespace CSharpTutorials.Examples
2{
3 class MyClassExample
4 {
5
6 }
7}
در مثال فوق، «CSharpTutorials.Examples.MyClassExample» نام کاملاً واجد شرایط نام کلاس MyClassExample است.
به این ترتیب، مباحث مربوط به مفهوم کلاس در سی شارپ نیز همراه با ذکر مثال پوشش داده شد. به طور کلی، در این مقاله مباحث جامعی پیرامون مفهوم کلاس در برنامه نویسی شی گرا در سه زبان برنامه نویسی رایج و کاربردی شرح داده شدند. حال در بخش انتهایی، دورههای آموزشی مرتبط با برنامه نویسی شی گرا معرفی شدهاند.
جمعبندی
در مقاله آموزش مفهوم کلاس در برنامه نویسی شی گرا ، مفاهیم بنیادی کلاس در شی گرایی به طور جامع با مثالهای مختلف و در سه زبان محبوب شرح داده شد. ابتدا به شرح تعاریف و مباحث نظری پرداخته شد و سپس مفاهیم مربوطه به همراه مثالهای عینی به صورت عملی آموزش داده شدند. کار با یک مثال ساده در دنیای واقعی آغاز شد و مباحث به صورت گامبهگام از سطح انتزاعی به سمت پیادهسازی کدها در زبان جاوا پیش رفت.
آموزش مفهوم کلاس در جاوا به سادهترین شکل ممکن پوشش داده شد و سپس آموزشهای لازم پیرامون مفهوم کلاس در پایتون ارائه شدند. پس از آن نیز مفهوم کلاس در سی شارپ با ذکر مثال شرح داده شد. در خلال این آموزشها مفاهیم شی گرایی شامل شی، متد، صفت، سازنده، ارثبری، تغییر دهنده سطح دسترسی، فیلد، فضای نام و سایر موارد پیادهسازی و توضیح داده شدند.
ممنون از این مقاله کاربردی
با سلام و احترام؛
صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاسگزاریم.
از اینکه این مطلب مورد توجه شما قرار گرفته بسیار خشنود هستیم.
برای شما آرزوی سلامتی و موفقیت داریم.
واقعا عالی بود
دم شما گرم
بسیار عالی؛ سپاس از شما
سلام
عالی بود دمت گرم خیلی به دردم خورد.
با تشکر از فرادرس