الرجوع للقائمة الرئيسية (Back to Home)

Lecture 2: Principles of OOP

المحاضرة الثانية: مبادئ الـ OOP

الشرح التفصيلي لجميع شرائح المحاضرة (Slide-by-Slide) مدعوم بشرح الأكواد سطراً بسطر والتريكات الهامة

Slide 4: مبادئ الـ OOP الأربعة (OOP Principles)

Slide 4

في السلايد دي بنتعرف على الأعمدة الأربعة اللي بيقوم عليها عالم الـ OOP بالكامل. أي لغة برمجة عشان نقول عليها إنها بتدعم الـ OOP، لازم تدعم المبادئ دي:

  • Encapsulation (الكبسلة/التغليف): تجميع الداتا (Variables) والوظائف (Functions) اللي بتتعامل معاهم في مكان واحد (Class)، ونخبي التفاصيل الداخلية عن أي حد بره الكلاس.
  • Abstraction (التجريد): إنك تظهر للمستخدم الحاجات اللي محتاجها بس (Essential Info) وتخفي عنه التعقيدات والتفاصيل الداخلية اللي ملهاش لازمة بالنسبة له.
  • Inheritance (الوراثة): كلاس جديد بياخد (يورث) خصائص ووظائف كلاس قديم، عشان نقلل تكرار الكود (Code Reuse).
  • Polymorphism (تعدد الأشكال): إن نفس الحاجة (زي دالة معينة) يكون ليها أكتر من شكل أو أكتر من طريقة تنفيذ بناءً على الكائن اللي بيستخدمها.

كل مبدأ من دول هنمسكه بالتفصيل في السلايدز الجاية.

Slide 5: الـ Encapsulation (التغليف)

Slide 5

مبدأ الـ Encapsulation هو ببساطة إننا بنخفي البيانات (Information hiding) جوه الكلاس، ومحدش يقدر يوصلها من بره بشكل مباشر. بنسمح بس بالوصول ليها عن طريق دوال (Functions) معينة إحنا اللي بنحددها.

class Rectangle { int width, height; public: void set_values (int, int); int area() {return width*height;} };

شرح الكود سطراً بسطر (Line-by-Line Analysis):

Slide 6: الـ Abstraction (التجريد)

Slide 6

الـ Abstraction معناه إننا بنقدم التفاصيل الأساسية للمستخدم، ونخفي عنه تفاصيل التنفيذ المعقدة. زي بالظبط لما تسوق عربية، إنت بتعرف تدوس بنزين وفرامل، بس مش محتاج تعرف الموتور بيحرق البنزين إزاي من جوه!

#include <iostream> using namespace std; class Adder { public: Adder(int i=0) { total = i; } void addNum(int number) { total += number; } int getTotal() { return total; } private: int total; };

شرح الكود سطراً بسطر (Line-by-Line Analysis):

Quiz 1: Encapsulation & Abstraction

1. Which OOP principle is mainly responsible for hiding the internal state (data) and requiring all interaction to be performed through an object's methods?

2. In C++, if no access specifier (public, private, protected) is declared at the beginning of a class, the members are by default:

Slide 7: الـ Inheritance (الوراثة) - الفكرة الأساسية

Slide 7

مبدأ الـ Inheritance أو الوراثة، بيحل لنا مشكلة تكرار الكود بشكل جذري. تخيل إن عندنا كلاس للطالب (Student) وكلاس للموظف (Employee).

هتلاقي إن الاتنين عندهم بيانات مشتركة زي: الاسم، العمر، العنوان. وعندهم دوال مشتركة زي إنهم بيتكلموا أو بياكلوا.

بدل ما نكتب الكود مرتين، الوراثة بتقولك: اعمل كلاس كبير سميه Person (شخص)، وحط فيه كل الحاجات المشتركة دي مرة واحدة.

وبعدين خلي الـ Student والـ Employee يورثوا من الـ Person، وبكده هياخدوا كل الحاجات المشتركة تلقائياً، وتزود بس الحاجات الخاصة بيهم (زي الجي بي إيه للطالب، والمرتب للموظف).

Slide 8: الـ Inheritance - المستويات (Parent & Child)

Slide 8

في السلايد دي بيوضح المسميات التقنية للوراثة اللي لازم تكون عارفها:

  • Parent Class (أو Base Class): ده الكلاس الأب، أو الأكثر عمومية (Most General). زي كلاس الـ Person.
  • Child Class (أو Derived Class): ده الكلاس الابن، اللي بيورث من الأب. بيكون أكثر تخصصاً (More Specific). زي كلاس الـ Student أو Employee.

الكلاس الابن بياخد (Attributes & Functions) بتاعة الكلاس الأب بالكامل، وبيقدر يضيف عليها الخاص بيه.

Slide 9: الـ Inheritance - شجرة الوراثة (Inheritance Tree)

Slide 9

الوراثة ممكن تكون شجرة متفرعة (Multi-level Inheritance). يعني الكلاس الابن ممكن يورثه كلاس تاني (يقى حفيد!).

  • الـ Person: هو الـ Most General (الأب الأكبر).
  • الـ Student: ورث من Person، وبقى هو نفسه أب لكلاسات تانية زي ITStudent و MathStudent.
  • الـ Employee: ورث من Person، وبقى أب لكلاس Driver (سواق) و Engineer (مهندس).

الكائن اللي بنعمله من ITStudent هيكون عنده الصفات الخاصة بـ ITStudent، زائد اللي ورثها من Student، زائد اللي ورثها من Person! شفت توفير الكود وصل لفين؟

Slide 10: الـ Inheritance - مثال الحيوانات

Slide 10

هنا مثال تاني كلاسيكي للتوضيح:

  • Base Class (الكلاس الأساسي): كلاس Animal (حيوان). عنده دوال مشتركة لأي حيوان زي eat() و sleep().
  • Derived Class (الكلاس المشتق/الابن): كلاس Dog (كلب). بيورث من Animal، وبنزودله دالة خاصة بيه وهي bark().

Slide 11: تطبيق الـ Inheritance بالكود (C++)

Slide 11

تعالوا نشوف إزاي بنكتب الوراثة فعلياً في لغة C++.

class staffmember { protected: int empolyeeid; string name, phone, email; public: void print(); double pay(); }; class empolyee : public staffmember { // employee specific data goes here };

شرح الكود سطراً بسطر (Line-by-Line Analysis):

Quiz 2: Inheritance

1. What access specifier should you use in a base class if you want the data to be hidden from the outside world, but still accessible to derived (child) classes?

2. What is the correct syntax in C++ to make a class 'Dog' inherit publicly from a class 'Animal'?

Slide 12: الـ Polymorphism (تعدد الأشكال)

Slide 12

الـ Polymorphism معناه حرفياً "القدرة على اتخاذ أكثر من شكل". برمجياً معناه إننا ممكن يكون عندنا نفس اسم الدالة، بس الدالة دي بتعمل أكشن مختلف (Behaviour) على حسب الكائن اللي بيناديها.

أمثلة للتوضيح:

  • عندنا كلاس أب اسمه Shape جواه دالة اسمها Draw().
  • الكلاس ده بيورثه كلاس Line، و Triangle، و Circle.
  • لما انادي دالة Draw() من كائن الدائرة، هترسم دائرة. ولما انادي نفس الدالة Draw() من كائن المثلث، هترسم مثلث! نفس الأمر، بأشكال تنفيذ مختلفة.

لو مفيش Polymorphism، كنت هضطر أعمل دوال بأسماء مختلفة: drawCircle() و drawTriangle()، وده هيخلي الكود معقد.

Slide 13: تطبيق الـ Polymorphism بالكود (C++)

Slide 13

في السلايد دي بنشوف مثال عملي على الـ Polymorphism باستخدام كلاسات الثدييات.

class Mammal { public: virtual void makeSound() = 0; string toString() { return "Mammal"; } }; class Cat : public Mammal { public: virtual void makeSound() { cout << "rawr" << endl; } string toString() { return "Cat"; } }; class Siamese : public Cat { public: virtual void makeSound() { cout << "meow" << endl; } string toString() { return "Siamese"; } virtual void scratchCouch() { cout << "scraaaatch" << endl; } };

شرح الكود سطراً بسطر (Line-by-Line Analysis):

Slide 14: فوائد الـ OOP (Benefits of using OOP)

Slide 14

كده نقدر نلخص أهم فوائد استخدام البرمجة كائنية التوجه (OOP):

  • Code can be reused by using inheritance: إعادة استخدام الكود بسهولة عن طريق الوراثة، فمش هنحتاج نكتب نفس الحاجة مرتين.
  • Data can be hidden from outside world by using encapsulation: إخفاء وحماية البيانات الحساسة عن طريق التغليف، فمحدش يلعب في الداتا بتاعتنا من بره.
  • Operators or functions can be overloaded by using polymorphism: إعادة استخدام نفس أسماء الدوال والأوامر لمهام مختلفة حسب الكائن عن طريق تعدد الأشكال.

Quiz 3: Polymorphism & OOP Benefits

1. What keyword in C++ is used in a base class to allow a function to be overridden in a derived class, enabling Polymorphism?

2. If you want to reuse existing code to build a new class with additional features, which OOP principle are you applying?

الملخص الشامل لأهم التريكات (Summary & Pro Tips)

سؤال مقالي متوقع للامتحان (Essay Question)

Question: Briefly define the four main principles of Object-Oriented Programming (OOP). Give a short real-world analogy for each.

🖥️ What is the output of the following code?

Q1:

class Test { private: int x; public: void setX(int val) { x = val; } int getX() { return x; } }; int main() { Test t1, t2; t1.setX(5); t2.setX(15); cout << t1.getX() + t2.getX() << endl; }

Q2:

class Box { public: int length; void setLength(int l) { length = l; } }; int main() { Box b; b.length = 10; b.setLength(20); cout << b.length << endl; }

✍️ Write a line of code for the following statements

Q1: Write a setter function called setName that takes a string parameter and assigns it to a private member called name.

Q2: Write a getter function called getAge that returns the value of a private integer member called age.

Q3: Write a setter function with validation: setGrade accepts a float, but only assigns it to member grade if the value is between 0 and 4.

🔍 Based on the following code, answer all the following questions

class BankAccount { private: double balance; public: void setBalance(double b) { if (b >= 0) balance = b; } double getBalance() { return balance; } void deposit(double amount) { balance = balance + amount; } }; int main() { BankAccount acc; acc.setBalance(1000); acc.deposit(500); cout << acc.getBalance() << endl; }

a) What is the output?

b) What will happen if we call acc.setBalance(-500);?

c) Why is balance declared as private?