ما هي البرمجة الشيئية مفاهيم جافا OOP مع أمثلة

- البرمجة الشيئية
- ما هي البرمجة الشيئية؟
- ما هي فوائد البرمجة الشيئية؟
- ما هي خصائص البرمجة الشيئية؟
- ما هي المبادئ الأساسية الأربعة / اللبنات الأساسية لـ OOP (البرمجة الشيئية)؟
البرمجة الشيئية
البرمجة الشيئية هي أسلوب برمجة يرتبط بمفاهيم مثل الفئة ، الكائن ، الوراثة ، التغليف ، التجريد ، تعدد الأشكال. معظم لغات البرمجة الشائعة مثل Java و C ++ و C # و Ruby وما إلى ذلك تتبع نموذج البرمجة الشيئية.
ما هي البرمجة الشيئية؟
تشير البرمجة الموجهة للكائنات (OOP) إلى نوع من البرمجة يحدد فيه المبرمجون نوع البيانات لهيكل البيانات ونوع العمليات التي يمكن تطبيقها على بنية البيانات.
نظرًا لأن Java هي أكثر المهارات المطلوبة ، فسوف نتحدث عن مفاهيم البرمجة الموجهة للكائنات في Java. يعتمد التطبيق المستند إلى الكائن في Java على إعلان الفئات وإنشاء كائنات منها والتفاعل بين هذه الكائنات. لقد ناقشت فئات وكائنات Java التي تعد أيضًا جزءًا من مفاهيم البرمجة الموجهة للكائنات .
ما هي فوائد البرمجة الشيئية؟
- تحسين الإنتاجية أثناء تطوير البرامج
- تحسين إمكانية صيانة البرامج
- سباقات تنمية أسرع
- انخفاض تكلفة التطوير
- برامج عالية الجودة
ما هي خصائص البرمجة الشيئية؟
خصائص البرمجة الشيئية هي:
- إنه يتبع نهجًا تصاعديًا.
- البرنامج الناتج عن البرمجة الشيئية عبارة عن مجموعة من الكائنات. كل كائن له بياناته الخاصة ومجموعة من العمليات.
- يقيد OOP حرية حركة البيانات والوظائف التي تعمل عليها.
- يمكن إعادة استخدام فئة محددة بشكل صحيح ، مما يفسح المجال لإعادة استخدام الكود.
- مفهوم البرمجة الشيئية كيانات العالم الحقيقي بشكل جيد للغاية.
- نظرًا لنهجها الموجه للكائنات ، فهي مفيدة للغاية في حل المشكلات المعقدة.
ما هي المبادئ الأساسية الأربعة / اللبنات الأساسية لـ OOP (البرمجة الشيئية)؟
اللبنات الأساسية للبرمجة الموجهة للكائنات هي الوراثة والتغليف والتجريد وتعدد الأشكال. دعونا نفهم المزيد عن كل منهم في التسلسل التالي:
ومع ذلك ، هناك بعض التحديات المرتبطة بـ OOP ، وهي:
- منحنى التعلم حاد
- حجم برنامج أكبر
- تنفيذ البرنامج بشكل أبطأ
- إنه ليس مقاسًا واحدًا يناسب جميع الحلول
لنبدأ بمفهوم البرمجة الكائنية الأول ، أي الوراثة.
البرمجة الشيئية: الوراثة Inheritance
في OOP ، تم تصميم برامج الكمبيوتر بطريقة يكون فيها كل شيء كائنًا يتفاعل مع بعضه البعض. الميراث هو أحد هذه المفاهيم حيث يمكن أن ترث خصائص فئة من قبل الأخرى. يساعد على إعادة استخدام الكود وإقامة علاقة بين الفئات المختلفة.

كما نرى في الصورة ، يرث الطفل ممتلكات والده. وبالمثل ، في Java ، هناك فئتان:
1. فئة الوالدين (الدرجة الممتازة أو الأساسية)
2. فئة الطفل (فئة فرعية أو فئة مشتقة )
تُعرف الفئة التي ترث الخصائص باسم فئة الطفل بينما تُعرف الفئة التي توارث خصائصها باسم فئة الأصل .
يتم تصنيف الميراث إلى 4 أنواع:

فلنبدأ بالنوع الأول من الميراث ، أي الميراث الفردي:
- الميراث الفردي:

في الميراث الفردي ، ترث فئة ما خصائص فئة أخرى. إنها تمكن فئة مشتقة من وراثة الخصائص والسلوك من فئة أصل واحد. سيؤدي هذا بدوره إلى تمكين إعادة استخدام الكود بالإضافة إلى إضافة ميزات جديدة إلى الكود الحالي.
هنا ، الفئة (أ) هي صنفك الأصلي ، والفئة (ب) هي فئة طفلك التي ترث خصائص وسلوك فئة الوالدين.
دعونا نرى صيغة الميراث الفردي:
Class A{---} Class B extends A ---} |
2. الميراث متعدد المستويات:

عندما يتم اشتقاق فئة من فئة مشتقة أيضًا من فئة أخرى ، أي فئة بها أكثر من فئة أصل واحدة ولكن على مستويات مختلفة ، فإن هذا النوع من الوراثة يسمى الميراث متعدد المستويات.
إذا تحدثنا عن المخطط الانسيابي ، فإن الفئة B ترث خصائص وسلوك الفئة A وترث الفئة C خصائص الفئة B. هنا A هي الفئة الأصل لـ B والفئة B هي الفئة الرئيسية لـ C. يرث C ضمنيًا خصائص وطرق الفئة A جنبًا إلى جنب مع الفئة B. وهذا هو الميراث متعدد المستويات.
دعونا نرى صيغة الوراثة متعددة المستويات في Java:
Class A{---} Class B extends A{---} Class C extends B{---} |
3 – الميراث الهرمي:

عندما يكون للفصل أكثر من فئة فرعية واحدة (فئات فرعية) أو بعبارة أخرى ، فإن أكثر من فئة فرعية لها نفس الفئة الأصل ، فإن هذا النوع من الميراث يُعرف بالتسلسل الهرمي .
إذا تحدثنا عن المخطط الانسيابي ، فإن الصنفين B و C هما الفصول الفرعية التي ترث من الفئة الأصلية ، أي الفئة A.
دعونا نرى صيغة الوراثة الهرمية في Java:
Class A{---} Class B extends A{---} Class C extends A{---} |
- الوراثة الهجينة:

الوراثة الهجينة هي مزيج من الوراثة المتعددة والميراث متعدد المستويات . نظرًا لأن الوراثة mu ltiple غير مدعومة في Java لأنها تؤدي إلى الغموض ، لذلك لا يمكن تحقيق هذا النوع من الوراثة إلا من خلال استخدام الواجهات.
إذا تحدثنا عن المخطط الانسيابي ، فإن الفئة A هي فئة الأصل للفئة B و C ، في حين أن الفئة B و C هي الفئة الأصلية لـ D وهي الفئة الفرعية الوحيدة من B و C.
الآن تعلمنا عن الميراث وأنواعها المختلفة. دعنا ننتقل إلى مفهوم برمجة آخر موجه للكائنات ، مثل التغليف.
البرمجة الشيئية: التغليف Encapsulation
التغليف عبارة عن آلية تقوم فيها بربط بياناتك وكودك معًا كوحدة واحدة. يعني أيضًا إخفاء بياناتك من أجل حمايتها من أي تعديل . ماذا يعني هذا؟ أفضل طريقة لفهم الكبسولة هي إلقاء نظرة على مثال للكبسولة الطبية ، حيث يكون الدواء دائمًا آمنًا داخل الكبسولة. وبالمثل ، من خلال التضمين ، تكون طرق ومتغيرات الفصل مخفية وآمنة بشكل جيد.

يمكننا تحقيق التغليف في Java عن طريق:
- إعلان متغيرات فئة على أنها خاصة.
- توفير طرق الإعداد العامة والجمع لتعديل قيم المتغيرات وعرضها.
دعونا نلقي نظرة على الكود أدناه للحصول على فهم أفضل للتغليف:
public class Employee { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main (String[] args) { } } |
دعونا نحاول فهم الكود أعلاه. لقد قمت بإنشاء فئة موظف له اسم متغير خاص . بعد ذلك ، أنشأنا أساليب getter و setter يمكننا من خلالها الحصول على اسم الموظف وتعيينه. من خلال هذه الطرق ، يجب على أي فئة ترغب في الوصول إلى متغير الاسم القيام بذلك باستخدام طرق getter و setter هذه.
البرمجة الشيئية: التجريد Abstraction

يشير التجريد إلى جودة التعامل مع الأفكار بدلاً من الأحداث. إنه يتعامل بشكل أساسي مع إخفاء التفاصيل وإظهار الأشياء الأساسية للمستخدم. إذا نظرت إلى الصورة هنا ، فعندما نتلقى مكالمة ، نحصل على خيار إما استلامها أو رفضها فقط. لكن في الواقع ، هناك الكثير من التعليمات البرمجية التي تعمل في الخلفية. لذا فأنت لا تعرف المعالجة الداخلية لكيفية إنشاء مكالمة ، هذا هو جمال التجريد. لذلك ، يساعد التجريد في تقليل التعقيد. يمكنك تحقيق التجريد بطريقتين:
أ) فئة الملخص
ب) الواجهة
دعونا نفهم هذه المفاهيم بمزيد من التفصيل.
فئة الملخص: تحتوي فئة الملخص في جافا على الكلمة الأساسية “الخلاصة”. الآن ماذا تعني الكلمة الأساسية المجردة؟ إذا تم إعلان فئة مجردة ، فلا يمكن إنشاء مثيل لها ، مما يعني أنه لا يمكنك إنشاء كائن من فئة مجردة. أيضًا ، يمكن للفصل المجرد أن يحتوي على طرق مجردة بالإضافة إلى طرق ملموسة.
ملاحظة : يمكنك تحقيق 0-100٪ تجريد باستخدام فئة abstract.
لاستخدام فئة مجردة ، عليك أن ترثها من فئة أخرى حيث يتعين عليك توفير تطبيقات للطرق المجردة هناك نفسها ، وإلا ستصبح أيضًا فئة مجردة.
لنلقِ نظرة على صيغة الجملة المجردة cl ass:
Abstract class Mobile { // abstract class mobileAbstract void run(); // abstract method |
الواجهة: تعد الواجهة في Java مخططًا لفئة أو يمكنك القول إنها مجموعة من الأساليب المجردة والثوابت الثابتة. في الواجهة ، تكون كل طريقة عامة ومجردة ولكنها لا تحتوي على أي مُنشئ. إلى جانب التجريد ، تساعد الواجهة أيضًا على تحقيق الوراثة المتعددة في Java.
ملاحظة : يمكنك تحقيق تجريد بنسبة 100٪ باستخدام الواجهات.
لذا فإن الواجهة هي في الأساس مجموعة من الأساليب ذات الصلة بأجسام فارغة. دعونا نفهم الواجهات بشكل أفضل من خلال أخذ مثال لواجهة “ParentCar” مع الأساليب ذات الصلة.
public interface ParentCar { public void changeGear ( int newValue); public void speedUp (int increment); public void applyBrakes (int decrement); } |
يجب أن تكون هذه الأساليب موجودة لكل سيارة ، أليس كذلك؟ لكن عملهم سيكون مختلفًا.
لنفترض أنك تعمل مع سيارة يدوية ، هناك عليك زيادة الترس واحدًا تلو الآخر ، ولكن إذا كنت تعمل مع سيارة أوتوماتيكية ، ففي ذلك الوقت يقرر نظامك كيفية تغيير السرعة فيما يتعلق بالسرعة. لذلك ، ليست كل الفئات الفرعية الخاصة بي لها نفس المنطق المكتوب لتغيير العتاد . نفس الحالة تتعلق بالتسريع ، فلنفترض الآن أنه عندما تضغط على مسرع ، فإنه يتسارع بمعدل 10 كم أو 15 كم. لكن لنفترض أن شخصًا آخر يقود سيارة خارقة ، حيث تزيد بمقدار 30 كم أو 50 كم. مرة أخرى يختلف المنطق. Si mil arl y لـ ا ف بمكابح طية، حيث قد يكون لدى شخص ما مكابح قوية ، قد لا يكون للآخر.
نظرًا لأن جميع الوظائف مشتركة مع جميع الفئات الفرعية الخاصة بي ، فقد قمت بإنشاء واجهة “ParentCar” حيث توجد جميع الوظائف. بعد ذلك ، سوف أقوم بإنشاء فئة فرعية تقوم بتنفيذ هذه الواجهة ، حيث يختلف تعريف كل هذه الطريقة.
N ext ، فلنلقِ نظرة على الوظائف المتعلقة بكيفية تنفيذ هذه الواجهة. ولتنفيذ هذه الواجهة ، سيتغير اسم فصلك الدراسي إلى أي علامة تجارية معينة لسيارة ، دعنا نقول أنني سأحصل على “أودي”. لتنفيذ واجهة الفصل ، سأستخدم الكلمة الأساسية “تنفيذ” كما هو موضح أدناه:
public class Audi implements ParentCar { ; int speed=0 int gear=1; public void changeGear( int value){ gear=value; } public void speedUp( int increment){ speed=speed+increment; } public void applyBrakes(int decrement){ speed=speed-decrement; } void printStates(){ System.out.println("speed:"+speed+"gear:"+gear); } public static void main (String[] args) { // TODO Auto-generated method stubAudi A6= new Audi(); A6.speedUp(50); A6.printStates(); A6.changeGear(4); A6.SpeedUp(100); A6.printStates(); } } |
هنا كما ترون ، قمت بتوفير وظائف للطرق المختلفة التي أعلنتها في فئة الواجهة الخاصة بي. يتيح تطبيق الواجهة للفصل أن يصبح أكثر رسمية فيما يتعلق بالسلوك الذي يعد بتقديمه. يمكنك أيضًا إنشاء فئة أخرى ، على سبيل المثال فئة BMW التي يمكن أن ترث نفس الواجهة “السيارة” بوظائف مختلفة.
لذلك آمل أن تكونوا واضحين في التعامل مع الواجهة وكيف يمكنكم تحقيق التجريد باستخدامها.
أخيرًا ، يعد مفهوم البرمجة الشيئية الأخير هو تعدد الأشكال.
البرمجة الشيئية: تعدد الأشكال Polymorphism
يعني تعدد الأشكال اتخاذ العديد من الأشكال ، حيث تعني كلمة “بولي” العديد وتعني “التحويل” الأشكال. إنها قدرة المتغير أو الوظيفة أو الكائن على اتخاذ أشكال متعددة. بمعنى آخر ، يتيح لك تعدد الأشكال تحديد واجهة أو طريقة واحدة ولها تطبيقات متعددة.
دعونا نفهم هذا من خلال أخذ مثال من الحياة الواقعية والثانية كيف يتناسب هذا المفهوم مع البرمجة الموجهة للكائنات.

لنفكر في سيناريو العالم الحقيقي في لعبة الكريكيت ، فنحن نعلم أن هناك أنواعًا مختلفة من لاعبي البولينج ، مثل لاعبي البولينج السريع ، ولاعبي البولينج متوسطي السرعة والغزالين. كما ترون في الشكل أعلاه ، هناك فئة أبوية – BowlerClass ولديها ثلاث فئات فرعية: FastPacer و MediumPacer وSpinner .
bowlingMethod() حيث ترث جميع الفئات الفرعية هذه الطريقة. كما نعلم جميعًا أن الرامي السريع سوف يذهب إلى الوعاء بشكل مختلف مقارنةً بالكرة المتوسطة والدوران من حيث سرعة البولينج ، والركض الطويل وطريقة البولينج ، إلخ .bowlingMethod() ستكون مختلفة أيضًا بالمقارنة مع لاعبي البولينج الآخرين. ونفس الشيء يحدث مع فئة الدوار. الهدف من المناقشة أعلاه هو ببساطة أن الاسم نفسه يميل إلى أشكال متعددة. كل الفئات الثلاث المذكورة أعلاه في لها
bowlingMethod() لكن تنفيذها يختلف تمامًا عن بعضها البعض
تعدد الأشكال في جافا نوعان:
- تشغيل تعدد الأشكال وقت
- تجميع تعدد الأشكال الزمني
تعدد أشكال وقت التشغيل Run time : في Java ، يشير تعدد أشكال وقت التشغيل إلى عملية يتم فيها حل استدعاء طريقة تم تجاوزها في وقت التشغيل runtime بدلاً من وقت compile-time . في هذا ، يتم استخدام متغير مرجعي لاستدعاء طريقة متجاوزة من فئة فائقة في وقت التشغيل. يعد تجاوز الطريقة مثالاً على تعدد أشكال وقت التشغيل. دعونا نلقي نظرة على الكود التالي لفهم كيفية عمل تجاوز هذه الطريقة:
public Class BowlerClass{ void bowlingMethod(){ System.out.println(" bowler "); } public Class FastPacer{ void bowlingMethod(){ System.out.println(" fast bowler "); } Public static void main (String[] args){ FastPacer obj= new FastPacer(); obj.bowlingMethod(); } } |
تعدد أشكال وقت التجميع Compile : في Java ، يشير تعدد أشكال compile-time إلى عملية يتم فيها حل استدعاء طريقة التحميل الزائد في وقت compile-time بدلاً من وقت التشغيل runtime . طريقة التحميل الزائد هي مثال على تعدد أشكال وقت compile-time. الأسلوب الزائد هو ميزة تسمح للفصل بأن يكون له طريقتان أو أكثر لهما نفس الاسم ولكن الوسائط التي تم تمريرها إلى الطرق مختلفة. على عكس تجاوز الطريقة ، يمكن أن تختلف الوسيطات في:
- عدد المعلمات التي تم تمريرها إلى الأسلوب
- نوع بيانات المعلمات
- تسلسل أنواع البيانات عند تمريرها إلى طريقة.
دعونا نلقي نظرة على الكود التالي لفهم كيفية عمل طريقة التحميل الزائد:
class Adder { Static int add(int a, int b){ return a+b; } static double add( double a, double b){return a+b;} public static void main (String args[]){ System.out.println(Adder.add(11,11)); System.out.println(Adder.add(12.3,12.6)); } } |
آمل أن تكونوا واضحين مع جميع مفاهيم البرمجة الموجهة للكائنات التي ناقشناها أعلاه ، مثل الوراثة والتغليف والتجريد وتعدد الأشكال. يمكنك الآن جعل تطبيق Java الخاص بك أكثر أمانًا وبساطة وقابلية لإعادة الاستخدام باستخدام مفاهيم Java OOP.