مخفیسازی
کپسوله سازی، مخفیسازی (Encapsulation)، یا لفافهبندی، به این مفهوم اشاره دارد که باید بعضی خصوصیات یا رفتارهای شیء را از دید دیگران پنهان کرد. فرض کنید شما به عنوان یک راننده میخواهید اتومبیل شخصی تان را روشن کنید و به محل کارتان عزیمت کنید سوییچ را بر میدارید، استارت میزنید و با فشار آوردن به پدالهای گاز و ترمز و چرخش فرمان و ... به محل کارتان خواهید رسید. در طول این مسیر در اتومبیل شما به عنوان یک شیء اعمال مختلفی در حال انجام بود. مثلاً لنت ترمز به دیسک چرخ برخورد میکرد و باعث کم شدن سرعت میشد یا شمعها شروع به جرقه زدن در زمانی بخصوصی میکردند. حال فرض کنید که عمل مخفی سازی وجود نداشت و شما مجبور بودید که جرقه زدن شمعها را کنترل میکردید و به سیستم سوخت رسانی در موقع لزوم دستور میدادید که سوخت را بداخل سیلندرها ارسال کند و... یا هیچگاه به مقصد نمیرسیدید! یا سالم نمیرسیدید!
عمل مخفی سازی باعث میشود که اشیاء بدون آنکه از چگونگی کارکرد یکدیگر اطلاع داشته باشند با هم کار کنند.
چندریختی
چند ريختي(Polymorphism) چند ریختی،كميتي است كه به يك رابط امكان مي دهد تا براي يك كلاس عمومي،از عمليات يكساني استفاده كند.عمل خاص كلاس را ذات حقيقي شيء تعيين مي كند.مثال ساده اي از چند ريختي،فرمان اتومبيل است.عمل فرمان اتومبيل براي تمام اتومبيل ها بدون توجه به ساز و كاري كه دارند،يكسان است.فرمان براي اتومبيل كه به طور مكانيكي كار مي كند يا با نيروي برق يا هر چيز ديگري،عمل يكساني را انجام مي دهد.بنابراين،پس از اينكه شما عملكرد فرمان را ياد گرفتيد،مي توانيد فرمان هر اتومبيلي را كنترل كنيد.همين هدف در برناهه نويسي نيز اعمال مي شود. به طور كلي،مفهوم چند ريختي،اغلب با عبارت ((يك رابط،چندين روش))بيان مي شود. اين بدين معني است كه امكان طراحي رابط عمومي براي گروهي از عمليات مرتبط وجود دارد. چند ريختي یا چندشکلی (Polymorphism) به این معنا است که اشیاء میتوانند در موقعیتهای مختلف، رفتارهای متفاوتی بروز دهند. مثلاً یک تابع در صورتی که بر روی نمونهای از کلاس آ فراخوانی شود، رفتار ب را بروز دهد در حالی که اگر بر روی کلاس ج (که فرزند کلاس آ است) فراخوانی شود، رفتاری متفاوت انجام دهد.
انتزاع / تجرید
به این معنا است که بخشی از یک موجودیّت یک مفهوم را که میان همهٔ وارثان مشترک است، پیش تعریف کنیم. این توانایی منجر به داشتن نگاه مشابه به موجودیّت های مشابه میگردد.
یک مثال کاربردی
در اطراف ما اشیاء زیادی وجود دارد و میتوان تمام مفاهیم موجود در طبیعت را با اشیاء تقلیل داد. مثلاً یک ماشین باربری. این ماشین یک سری خصوصیات دارد: چهار چرخ، یک پدال ترمز، یک پدال گاز، یک فرمان و یک محل بزرگ برای قرار دادن اشياء در آن و.... این ماشین در صورتی که ما پدال گاز آن را فشار دهیم، حرکت میکند. در صورتی که فرمان آن را بچرخانیم تغییر مسیر میدهد. پس این شیء علاوه بر یک سری خصوصیات، یک سری رفتار مشخص هم به ما نشان میدهد. ولی فقط این یک ماشین نیست که این کار را انجام میدهد. تمامی ماشینها این کارها را انجام میدهند. پس میتوانیم این ماشین را 'تعریف' کنیم و بگوییم:
ماشین باربری وسیلهای است که چهار چرخ، یک گاز، یک ترمز، یک فرمان و یک محل برای حمل بار دارد و اگر پدال گاز آن فشار داده شود حرکت میکند. این تعریف این ماشین است ولی خود آن نیست. هر زمانی چنین ماشینی بخواهیم به کارخانه تولید آن میرویم و از فروشندگان میخواهیم تا با توجه به این تعریف یک ماشین به ما بدهند.
مفاهیم فوق در زبانهای برنامه نویسی شیءگرا گنجانده شدهاند. در این زبانها، اشیاء زیادی از پیش وجود دارند که برنامهنویسان میتوانند از آنها استفاده کنند.
ارتباط اشیاء
مجدداً به مثال ماشین باربری بر میگردیم و این بار، یک ماشین سواری را تعریف میکنیم. ماشین سواری شیئی است که چهار چرخ، یک ترمز، یک پدال گاز و یک صندوق عقب دارد. این تعریف به تعریف ماشین باربری بسیار شبیه است. به عبارت دیگر ما به یک تعریف جدید میرسیم: خودرو. خودرو وسیلهای است که چهار چرخ، یک ترمز، یک پدال گاز دارد. پس از این به بعد تعریف ماشین باربری و ماشین سواری خیلی سادهتر میشود.
ماشین باربری، خودرویی است که محلی برای قرار دادن بار داشته باشد و ماشین سواری خودروییاست که صندوق عقب داشته باشد.
* اگر کسی به درب کارخانه مراجعه کند و بگوید که 'خودرو' میخواهد، چیزی دریافت نمیکند. خودرو یک تعریف انتزاعی است، برای تعریف خودرو شیء وجود ندارد پس مشتری تنها میتواتند ماشین باربری یا ماشین سواری بخواهد.
* کارواش را در نظر میگیریم. این کارواش خودرو را تمیز میکند و دیگر به طور جزئی عنوان نمیکند که کدام نوع خودرو را تمیز میکند. به عبارت دیگر نوع خودرو برای کارواش مهم نیست.
* وقتی شخصی قصد اجاره خودرویی دارد، و میخواهد جنسی را حمل کند در هنگام نماس با متصدی کرایه ماشین میگوید: «اگر خودرو شمااز نوع باربری است، برای من ارسال کنید»، ولی اگر قصد جابجا شدن را دارد میگوید : «برای من یک ماشین سواری بفرستید.»
در زبانهای برنامه نویسی شیءگرا نیز اشیاء مختلفی وجود دارند که تعریف آنها تکمیل کننده یکدیگر است، به عبارت دیگر اشيا از یکدیگر ارث بری میکنند. برخی از تعاریف کاملاً عام است و نمیتوان از آنها نمونه شیئی ساخت و تنها تعریف هستند. به این تعاریف Interface گفته میشود.
کلاس
در مهندسی نرمافزار و مهندسی دانش کلاس نقشهٔ نوعی و مشترک برای گروهی از اشیاء است که ویژگیهای مشترکی داشته، و رفتارهای مشترکی از خود نشان میدهند. درواقع، کلاسها انوع جدیدی هستند که شخص برنامهنویس، خود، آنها را برای حل مسئلههای دنیای واقعی طراحی میکند، و حاوی تعریفهای لازم برای دو عنصر اساسی زیر میباشند:
* دادهها، یا صفات
* عملیات، یا روشها
اشیاء نمونههایی هستند که به هنگام اجراء از روی نقشهٔ ارائه شده بهوسیلهٔ کلاس ایجاد میشوند. میتوان گفت همانطور که متغیر نمونهای از انواع اولیه است، شیء نمونهای از کلاس است.
برنامهنویسی شیءگرا، دادهها (خواص) و متدها (رفتارها) را در بستههایی به نام کلاس محصور میکند. کلاسها دارای خاصیت پنهانسازی اطلاعات هستند. این بدان معناست که اشیاء میدانند که چگونه از طریق رابطهای تعریفشده با یکدیگر ارتباط برقرار کنند. معمولا، اشیاء نباید از چگونگی پیادهسازی اشیاء دیگر مطلع باشند، بهعبارت دیگر، جزئیات پیادهسازی در داخل خود اشیاء پنهان شدهاند.
مثال: رانندگی خودرو بدون اطلاع از خصوصیات طرز کار داخلی موتور و سیستمهای اگزوز و جعبهدنده امکانپدیر است. در مهندسی نرمافزار ضرورت پنهانسازی اطلاعات امری بسیار مهم هست.
در زبانهای رویهای برنامهنویسی، مثل زبان سی، برنامهنویسی، بیشتر عملگرایانه است. درحالیکه، زبانهای برنامهنویسی سیپلاسپلاس، جاوا، و سیشارپ شیءگرایانه هستند. واحد برنامهنویسی در زبانهای رویهای تابع است، ولی، در زبانهای اشیاءنگر کلاسها - که اشیاء نهایتا از آنها ایجاد میشوند ( یا اصطلاحا نمونهسازی میشوند) - واحد برنامهنویسی را تشکیل میدهند. توابع نیز در داخل کلاسها به عنوان متدهایی محصور میشوند.
برنامهنویسان c بیشتر بر روی نوشتن توابع متمرکز هستند. گروههایی از اعمال که وظیفهٔ خاصی را بر عهده دارند، توابع را تشکیل میدهند و توابع گروه شده و برنامه را تشکیل میدهند. البته در زبان c دادهها نیز مهم هستند، اما نگرش اصلی در اینگونه زبانها این است که دادهها بیشتر برای پشتیانی اعمالی که توابع انجام میدهند به کار میروند.