Seamless design · High performance
List · Class · Object · Encapsulation · Inheritance · Abstraction · Interface · Polymorphism
مادة مرجعية منظّمة · أمثلة عملية · تمارين مع حلول
قاعدة هذه المحاضرة: لا نستخدم
Constructorفي أي صنف. ننشئ الكائن بـnewثم نعيّن القيم عبر الحقول العامة أو دوالSet/Get. ولا نكتب upcasting في متغير مثلShape s = r— نستخدم نوع الابن مباشرة أوList<الأب>.
البرمجة كائنية التوجه (OOP) ليست مجرد «صنوف وكائنات» — بل طريقة لتنظيم البرنامج حول كيانات لها بيانات وسلوك. نبدأ بـ List لتخزين مجموعات، ثم نبني نماذج حقيقية بـ Class وObject، ونطبّق أربع ركائز: التغليف، الوراثة، التجريد، وتعدد الأشكال — مع Interface كعقد سلوكي مرن.
التعريف: List<T> هيكل بيانات من System.Collections.Generic يخزّن عناصر من نوع واحد T ويتوسع أو يتقلص أثناء التشغيل.
| الميزة | مصفوفة int[] |
List<int> |
|---|---|---|
| الحجم | ثابت غالبًا عند الإنشاء | ديناميكي — Add / Remove |
| الوصول | arr[i] |
list[i] |
| عدد العناصر | Length |
Count |
| دوال جاهزة | قليلة | Contains, Sort, RemoveAt… |
| العضو | الدور |
|---|---|
Add(item) |
إضافة في نهاية القائمة |
Remove(item) |
حذف أول تطابق للقيمة |
RemoveAt(index) |
حذف عند فهرس محدد |
Contains(item) |
هل العنصر موجود؟ |
Count |
عدد العناصر الحالي |
Clear() |
إفراغ القائمة |
Sort() |
ترتيب تصاعدي (للأنواع القابلة للمقارنة) |
يمكن أن يكون T أي نوع — حتى صنف أنشأته أنت: List<Student> يخزّن مراجعًا لكائنات Student.
List<int> numbers = new List<int>();
numbers.Add(10);
numbers.Add(20);
numbers.Add(30);
for (int i = 0; i < numbers.Count; i++)
{
Console.WriteLine(numbers[i]);
}
الـ class هو قالب تصميمي (Blueprint) يجمع:
Name, AgePrintInfo()تعريف الـ class وحده لا يخصص ذاكرة للكائنات. الذاكرة تُخصص عند new ClassName().
class Book
{
public string Title;
public string Author;
public int Pages;
public void PrintInfo()
{
Console.WriteLine(Title + " - " + Author);
}
}
الـ object (أو instance) هو نسخة ملموسة من الـ class في الذاكرة. كل كائن له نسخة مستقلة من الحقول.
Book b1 = new Book();
b1.Title = "C# Basics";
b1.Author = "Abdullah";
b1.Pages = 250;
Book b2 = new Book();
b2.Title = "OOP Guide";
b2.Author = "Sara";
b2.Pages = 180;
b1.PrintInfo(); // C# Basics - Abdullah
b2.PrintInfo(); // OOP Guide - Sara
الصنوف في C# من الأنواع المرجعية: المتغير Book b1 يحمل مرجعًا (عنوانًا) للكائن في الذاكرة، وليس نسخة كاملة من البيانات. لذلك:
Book a = new Book();
a.Title = "Test";
Book b = a; // b يشير لنفس الكائن
b.Title = "Changed";
Console.WriteLine(a.Title); // Changed
المتغير المرجعي يمكن أن يكون null — أي لا يشير لأي كائن. استخدم new قبل الوصول للحقول.
| المفهوم | التشبيه | في الكود |
|---|---|---|
| Class | مخطط بيت | class Car { ... } |
| Object | بيت مبني فعليًا | Car c = new Car(); |
| Field | غرفة في البيت | public string Color; |
| Method | فعل يمكن للبيت «فعله» | public void Drive() |
التعريف: دمج البيانات والسلوك داخل صنف واحد، مع إخفاء التفاصيل الداخلية وإتاحة وصول مضبوط عبر واجهة عامة.
| المعدّل | من يرى العضو؟ |
|---|---|
public |
أي كود داخل المشروع |
private |
داخل نفس الـ class فقط |
protected |
داخل الـ class والأصناف الوريثة |
Set / Getالنمط المعتمد هنا: حقول private + دوال Set / Get عامة (بدون Constructor).
class BankAccount
{
public string OwnerName;
private int balance;
public void SetBalance(int amount)
{
balance = amount;
}
public int GetBalance()
{
return balance;
}
}
من خارج الصنف: acc.SetBalance(500) و acc.GetBalance() مسموحان، لكن acc.balance = -1000 ممنوع لأن balance خاص.
التعريف: آلية يحصل فيها صنف فرعي (Derived) على أعضاء صنف أساسي (Base) ويضيف أو يعدّل سلوكًا خاصًا به. العلاقة: is-a — الطالب نوع من شخص.
class Person
{
public string Name;
public int Age;
public void Introduce()
{
Console.WriteLine("أنا " + Name);
}
}
class Student : Person
{
public int Grade;
public void ShowGrade()
{
Console.WriteLine(Name + " علامته: " + Grade);
}
}
Student يرث Name, Age, Introduce() دون إعادة كتابتها.
الحقول protected تظهر للأبناء فقط — مفيدة عندما تريد إخفاءها عن الخارج لكن إتاحتها للأصناف الوريثة.
class Animal
{
public string Name;
public virtual void MakeSound()
{
Console.WriteLine("صوت عام");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Woof!");
}
}
class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Meow!");
}
}
virtual في الأب: «يمكن للابن تغيير السلوك»override في الابن: «أنا أقدّم تنفيذًا جديدًا»C# تدعم وراثة واحدة للصنف (class B : A فقط)، لكن يمكن تنفيذ عدة واجهات لاحقًا.
التعريف: إظهار ما يفعله الكيان دون كشف كيف ينفّذ التفاصيل. في C# نستخدم abstract class — صنف لا يمكن إنشاء كائن منه مباشرة، وقد يحتوي دوالًا مجردة يجب على الأبناء تنفيذها.
| النوع | إنشاء كائن؟ | دوال مجردة؟ |
|---|---|---|
| class عادي | نعم — new Car() |
لا |
| abstract class | لا — new Shape() خطأ |
نعم — abstract void Draw() |
abstract class Shape
{
public string Color;
public abstract double GetArea();
public void PrintColor()
{
Console.WriteLine("اللون: " + Color);
}
}
class Rectangle : Shape
{
public double Width;
public double Height;
public override double GetArea()
{
return Width * Height;
}
}
class Circle : Shape
{
public double Radius;
public override double GetArea()
{
return 3.14 * Radius * Radius;
}
}
المستدعي يعرف: «كل شكل له GetArea()» — دون الاهتمام بمعادلة كل شكل.
التعريف: عقد (Contract) يحدد أسماء الدوال التي يجب على الصنف تنفيذها، بلا حقول تنفيذية (في الاستخدام التقليدي لهذه المحاضرة). الصنف «يلتزم» بالواجهة بـ class X : IY.
| Interface | Abstract Class | |
|---|---|---|
| الغرض | «ماذا يستطيع أن يفعل؟» | «ما هو نوعه + سلوك مشترك» |
| وراثة متعددة | نعم — عدة interfaces | صنف واحد فقط |
| حقول تنفيذ | لا (في نمطنا) | نعم |
interface IPrintable
{
void PrintInfo();
}
interface ISaveable
{
void SaveToFile();
}
class Product : IPrintable, ISaveable
{
public string Name;
public double Price;
public void PrintInfo()
{
Console.WriteLine(Name + " - " + Price);
}
public void SaveToFile()
{
Console.WriteLine("تم حفظ " + Name);
}
}
التعريف العام: نفس «الاسم» أو «المرجع» يعطي سلوكًا أو تنفيذًا مختلفًا حسب السياق. في C# نوعان أساسيان:
| Overloading — التحميل الزائد | Overriding — التجاوز | |
|---|---|---|
| متى؟ | وقت الترجمة (Compile-time) | وقت التشغيل (Runtime) |
| أين؟ | داخل نفس الصنف | بين الأب والابن (وراثة) |
| الشرط | نفس اسم الدالة + معاملات مختلفة | نفس التوقيع + virtual في الأب + override في الابن |
| مثال | Add(int,int) و Add(double,double) |
virtual void Print() ثم override void Print() |
| الفكرة | دالة واحدة بالاسم، عدة أشكال حسب المدخلات | الابن يستبدل تنفيذ الأب |
تذكّر: Overloading = تعدد في نفس الصنف. Overriding = تعدد عبر الوراثة. التجريد (
abstract) يجبر الابن على تنفيذ دالة مثلPrint()— وغالبًا يُستخدم مع Overriding.
Addclass Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public double Add(double a, double b)
{
return a + b;
}
public int Add(int a, int b, int c)
{
return a + b + c;
}
}
// Calculator calc = new Calculator();
// calc.Add(2, 3); // int
// calc.Add(2.5, 1.5); // double
// calc.Add(1, 2, 3); // ثلاثة أعداد
C# تختار الدالة المناسبة حسب عدد ونوع المعاملات عند الترجمة.
Printclass Document
{
public string Title;
public virtual void Print()
{
Console.WriteLine("مستند: " + Title);
}
}
class Invoice : Document
{
public int Amount;
public override void Print()
{
Console.WriteLine("فاتورة: " + Title + " - " + Amount);
}
}
Invoice inv = new Invoice();
inv.Title = "طلب #1";
inv.Amount = 500;
inv.Print(); // فاتورة: طلب #1 - 500
عند استدعاء Print() على كائن Invoice يُنفَّذ override الخاص بالابن. لاحقًا سنستخدم List لجمع عدة أنواع دون upcasting في متغير منفصل.
Printabstract class Report
{
public string Name;
public abstract void Print();
}
class SalesReport : Report
{
public int Total;
public override void Print()
{
Console.WriteLine(Name + " : المبيعات = " + Total);
}
}
الصنف المجرد يعرّف Print بدون جسم — كل ابن يجب أن ينفّذها.
List<Shape> shapes = new List<Shape>();
Rectangle r = new Rectangle();
r.Width = 4;
r.Height = 5;
Circle c = new Circle();
c.Radius = 3;
shapes.Add(r);
shapes.Add(c);
for (int i = 0; i < shapes.Count; i++)
{
Console.WriteLine(shapes[i].GetArea()); // 20 ثم 28.26
}
نبقي المتغيرات من نوع الابن (Rectangle, Circle) ونضيفها إلى List<Shape>. عند shapes[i].GetArea() يُختار override الصحيح وقت التشغيل — بدون كتابة Shape s = r.
List<Animal> zoo = new List<Animal>();
Dog d = new Dog();
d.Name = "Rex";
zoo.Add(d);
Cat c = new Cat();
c.Name = "Mimi";
zoo.Add(c);
for (int i = 0; i < zoo.Count; i++)
{
zoo[i].MakeSound(); // Woof! ثم Meow!
}
List<IPrintable> items = new List<IPrintable>();
Product p = new Product();
p.Name = "Laptop";
items.Add(p);
for (int i = 0; i < items.Count; i++)
{
items[i].PrintInfo();
}
| المفهوم | السؤال الذي يجيب عنه | الأداة في C# |
|---|---|---|
| Class / Object | ماذا يوجد في النظام؟ | class, new |
| Encapsulation | كيف نحمي البيانات؟ | private, Set/Get |
| Inheritance | كيف نعيد استخدام الكود؟ | class B : A |
| Abstraction | كيف نخفي التفاصيل؟ | abstract class |
| Interface | ما السلوك المطلوب؟ | interface |
| Polymorphism | كيف نتعامل مع أشكال متعددة لنفس الاسم؟ | Overloading (نفس الصنف) · virtual/override (وراثة) |
| List | كيف نخزّن مجموعات؟ | List<T> |
تمارين قصيرة جدًا — كل واحد يركّز على فكرة واحدة. اقرأ خطوات «المطلوب» بالترتيب قبل كتابة الكود. حاول الحل قبل فتح «عرض الحل».
Print وغيرهPrintالمطلوب:
abstract class Message يحتوي حقلًا عامًا string Text.abstract void Print() بدون جسم.TextMessage : Message ونفّذ Print() ليطبع قيمة Text على الشاشة.Main: أنشئ كائن TextMessage، عيّن Text، ثم استدعِ Print().بدون Constructor — عيّن الحقول بعد new.
using System;
abstract class Message
{
public string Text;
public abstract void Print();
}
class TextMessage : Message
{
public override void Print()
{
Console.WriteLine(Text);
}
}
Printالمطلوب:
abstract class Document مع حقل عام string Title.abstract void Print() — كل مستند يجب أن يطبع نفسه بطريقته.Invoice : Document وأضف حقلًا عامًا int Amount (المبلغ).Print() في Invoice ليطبع العنوان والمبلغ معًا (مثل: Title + " : " + Amount).Main: أنشئ Invoice، عيّن Title و Amount، ثم استدعِ Print().using System;
abstract class Document
{
public string Title;
public abstract void Print();
}
class Invoice : Document
{
public int Amount;
public override void Print()
{
Console.WriteLine(Title + " : " + Amount);
}
}
Showالمطلوب:
Animal مع حقل string Name ودالة مجردة abstract void Show().Dog : Animal ينفّذ Show() ويطبع اسم الكلب مع كلمة «كلب».Main: أنشئ Dog، عيّن الاسم، واستدعِ Show().using System;
abstract class Animal
{
public string Name;
public abstract void Show();
}
class Dog : Animal
{
public override void Show()
{
Console.WriteLine("كلب: " + Name);
}
}
IPrintالمطلوب:
interface IPrint تحتوي توقيع دالة void Print() فقط.Note : IPrint مع حقل string Content.Print() لطباعة Content.Main: أنشئ Note، اكتب نصًا في Content، واطبع.using System;
interface IPrint
{
void Print();
}
class Note : IPrint
{
public string Content;
public void Print()
{
Console.WriteLine(Content);
}
}
Drawالمطلوب:
Shape مع abstract void Draw().Square : Shape ينفّذ Draw() ويطبع شكلًا نصيًا للمربع (مثل []).Main: أنشئ Square واستدعِ Draw().using System;
abstract class Shape
{
public abstract void Draw();
}
class Square : Shape
{
public override void Draw()
{
Console.WriteLine("[]");
}
}
PrintInfoالمطلوب:
Employee مع string Name و abstract void PrintInfo().Worker : Employee مع حقل int Salary.PrintInfo() ليطبع الاسم والراتب.Main: أنشئ عاملًا، عيّن البيانات، واطبع.using System;
abstract class Employee
{
public string Name;
public abstract void PrintInfo();
}
class Worker : Employee
{
public int Salary;
public override void PrintInfo()
{
Console.WriteLine(Name + " - " + Salary);
}
}
Add وغيرهAddالمطلوب: تطبيق Overloading على دالة Add:
MathHelper (بدون Constructor).public int Add(int a, int b) ترجع مجموع عددين صحيحين.public double Add(double a, double b) بنفس الاسم لكن معاملات double.Main: أنشئ كائنًا وجرّب الاستدعاءين واطبع الناتجين.class MathHelper
{
public int Add(int a, int b) { return a + b; }
public double Add(double a, double b) { return a + b; }
}
Addالمطلوب: أضف Overloading ثالثًا لـ Add:
int,int).public int Add(int a, int b, int c) ترجع مجموع الثلاثة.Main: اطبع ناتج Add(1, 2, 3).class MathHelper
{
public int Add(int a, int b) { return a + b; }
public int Add(int a, int b, int c) { return a + b + c; }
}
Printالمطلوب: Overloading على Print:
Printer بدالتين بنفس الاسم Print.string وتطبع النص.int وتطبع الرقم.Main: جرّب كلا الاستدعاءين.using System;
class Printer
{
public void Print(string msg) { Console.WriteLine(msg); }
public void Print(int n) { Console.WriteLine(n); }
}
Showالمطلوب:
Screen مع Show() بدون معاملات — تطبع رسالة افتراضية.Show(string text) تطبع النص المرسل.Main: استدعِ الدالتين.using System;
class Screen
{
public void Show() { Console.WriteLine("empty"); }
public void Show(string text) { Console.WriteLine(text); }
}
Multiplyالمطلوب:
Calc عرّف Multiply(int a, int b).Multiply(double a, double b) بنفس الاسم.Main: اطبع ناتج ضرب عددين صحيحين وناتج ضرب عددين عشريين.class Calc
{
public int Multiply(int a, int b) { return a * b; }
public double Multiply(double a, double b) { return a * b; }
}
Displayالمطلوب:
Viewer مع Display(int x) تطبع رقمًا واحدًا.Display(int x, int y) تطبع رقمين مفصولين بفاصلة.Main: جرّب الاستدعاءين.using System;
class Viewer
{
public void Display(int x) { Console.WriteLine(x); }
public void Display(int x, int y) { Console.WriteLine(x + "," + y); }
}
Printالمطلوب: تطبيق Overriding على Print:
Item مع string Name و public virtual void Print() تطبع الاسم فقط.Product : Item مع double Price.Print() بـ override ليطبع الاسم والسعر.Main: أنشئ Product (وليس متغيرًا من نوع الأب)، عيّن الحقول، واستدعِ Print().using System;
class Item
{
public string Name;
public virtual void Print() { Console.WriteLine(Name); }
}
class Product : Item
{
public double Price;
public override void Print()
{
Console.WriteLine(Name + " $" + Price);
}
}
MakeSoundالمطلوب:
Animal مع virtual void MakeSound() تطبع ....Cat : Animal مع override void MakeSound() تطبع Meow.Main: أنشئ Cat واستدعِ MakeSound().using System;
class Animal
{
public virtual void MakeSound() { Console.WriteLine("..."); }
}
class Cat : Animal
{
public override void MakeSound() { Console.WriteLine("Meow"); }
}
ShowRoleالمطلوب:
Person مع Name و virtual void ShowRole() تطبع الاسم.Student : Person يعيد تعريف ShowRole() ليطبع الاسم مع كلمة «طالب».Main: أنشئ طالبًا، عيّن الاسم، واستدعِ ShowRole().using System;
class Person
{
public string Name;
public virtual void ShowRole() { Console.WriteLine(Name); }
}
class Student : Person
{
public override void ShowRole()
{
Console.WriteLine(Name + " : طالب");
}
}
GetAreaالمطلوب:
Shape مع virtual double GetArea() ترجع 0.Rectangle : Shape مع double W و double H.GetArea() لترجع W * H.Main: أنشئ مستطيلًا، عيّن الأبعاد، واطبع المساحة.class Shape
{
public virtual double GetArea() { return 0; }
}
class Rectangle : Shape
{
public double W, H;
public override double GetArea() { return W * H; }
}
المطلوب:
Animal مع virtual MakeSound()، و Dog و Cat مع override.List<Animal>.Dog و Cat كمتغيرين من نوع الابن (لا تكتب Animal a = new Dog()).list.Add(d) و list.Add(c).list[i].MakeSound() لكل عنصر.using System;
using System.Collections.Generic;
class Animal
{
public virtual void MakeSound() { }
}
class Dog : Animal
{
public override void MakeSound() { Console.WriteLine("Woof"); }
}
class Cat : Animal
{
public override void MakeSound() { Console.WriteLine("Meow"); }
}
List<Animal> list = new List<Animal>();
list.Add(new Dog());
list.Add(new Cat());
for (int i = 0; i < list.Count; i++) list[i].MakeSound();
المطلوب:
Car مع حقل عام string Name.public void PrintInfo() تطبع اسم السيارة.Main: أنشئ سيارة، عيّن الاسم، واستدعِ PrintInfo().using System;
class Car
{
public string Name;
public void PrintInfo() { Console.WriteLine(Name); }
}
Car c = new Car();
c.Name = "BMW";
c.PrintInfo();
المطلوب: تطبيق التغليف:
Account مع private int balance.public void SetBalance(int v) — تضع القيمة في balance.public int GetBalance() — ترجع الرصيد.Main: عيّن رصيدًا بـ SetBalance واطبعه بـ GetBalance.class Account
{
private int balance;
public void SetBalance(int v) { balance = v; }
public int GetBalance() { return balance; }
}
المطلوب: وراثة بسيطة:
Vehicle مع public string Brand.Car : Vehicle يضيف public string Model.Main: أنشئ Car، عيّن Brand و Model، واطبعهما.class Vehicle { public string Brand; }
class Car : Vehicle { public string Model; }
المطلوب:
List<int> فارغة.1، 2، 3 بـ Add.for و Count، اطبع كل عنصر في سطر.using System;
using System.Collections.Generic;
List<int> nums = new List<int>();
nums.Add(1); nums.Add(2); nums.Add(3);
for (int i = 0; i < nums.Count; i++) Console.WriteLine(nums[i]);
المطلوب:
MathHelper مع Overloading لـ Add (int و double).Main: اطبع Add(2, 3) و Add(2.5, 1.5).using System;
class MathHelper
{
public int Add(int a, int b) { return a + b; }
public double Add(double a, double b) { return a + b; }
}
MathHelper m = new MathHelper();
Console.WriteLine(m.Add(2, 3));
Console.WriteLine(m.Add(2.5, 1.5));
المطلوب:
Doc مع abstract void Print().A و B ينفّذان Print() كل واحد يطبع حرفًا مختلفًا.List<Doc>، وأضف كائن A وكائن B (من نوع الابن).Print() لكل عنصر.using System;
using System.Collections.Generic;
abstract class Doc
{
public abstract void Print();
}
class A : Doc { public override void Print() { Console.WriteLine("A"); } }
class B : Doc { public override void Print() { Console.WriteLine("B"); } }
List<Doc> docs = new List<Doc>();
docs.Add(new A()); docs.Add(new B());
for (int i = 0; i < docs.Count; i++) docs[i].Print();
المطلوب:
IPrint مع void Print().X : IPrint ينفّذ Print().List<IPrint>، أضف كائن X، واستدعِ Print() من القائمة.using System;
using System.Collections.Generic;
interface IPrint { void Print(); }
class X : IPrint { public void Print() { Console.WriteLine("X"); } }
List<IPrint> list = new List<IPrint>();
list.Add(new X());
list[0].Print();
Subالمطلوب: Overloading على Sub:
Calculator عرّف Sub(int a, int b) و Sub(double a, double b).Main: اطبع ناتج طرح عددين صحيحين وعددين عشريين.class Calculator
{
public int Sub(int a, int b) { return a - b; }
public double Sub(double a, double b) { return a - b; }
}
GetNameالمطلوب:
Entity مع Name و abstract string GetName().User : Entity ينفّذ GetName() ليرجع Name.Main: أنشئ مستخدمًا واطبع اسمه عبر GetName().abstract class Entity
{
public string Name;
public abstract string GetName();
}
class User : Entity
{
public override string GetName() { return Name; }
}
Infoالمطلوب:
Book مع Title و virtual string Info() ترجع العنوان.Ebook : Book يعيد تعريف Info() ليضيف كلمة توضح أنه كتاب رقمي.Main: أنشئ Ebook واطبع نتيجة Info().class Book
{
public string Title;
public virtual string Info() { return Title; }
}
class Ebook : Book
{
public override string Info() { return Title + " (digital)"; }
}
Concatالمطلوب:
Text مع Concat(string a, string b).Concat(string a, string b, string c).Main: جرّب دمج نصين وثلاثة نصوص واطبع النتيجة.class Text
{
public string Concat(string a, string b) { return a + b; }
public string Concat(string a, string b, string c) { return a + b + c; }
}
Runالمطلوب:
Machine مع abstract void Run().CarMachine : Machine ينفّذ Run() ويطبع رسالة تشغيل.Main: أنشئ CarMachine واستدعِ Run().using System;
abstract class Machine
{
public abstract void Run();
}
class CarMachine : Machine
{
public override void Run() { Console.WriteLine("Run"); }
}
المطلوب: Overloading + Overriding معًا:
Base مع virtual void Show() تطبع Base.void Show(int x) تطبع الرقم (Overloading — ليست virtual).Child : Base يعيد تعريف Show() فقط ليطبع Child.Main: أنشئ Child واستدعِ Show() و Show(5).using System;
class Base
{
public virtual void Show() { Console.WriteLine("Base"); }
public void Show(int x) { Console.WriteLine(x); }
}
class Child : Base
{
public override void Show() { Console.WriteLine("Child"); }
}
تمارين تركز على List<T>. كل تمرين يحدّد الخطوات بالتفصيل في قسم المطلوب.
List + طباعة + متوسط حسابيالمطلوب:
List<int> لتخزين العلامات.int.Parse(Console.ReadLine())، وأضفها بـ Add.sum / (double)marks.Count واطبع النتيجة.using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> marks = new List<int>();
for (int i = 0; i < 5; i++)
{
Console.Write("أدخل علامة: ");
int m = int.Parse(Console.ReadLine());
marks.Add(m);
}
Console.WriteLine("العلامات:");
for (int i = 0; i < marks.Count; i++)
{
Console.WriteLine(marks[i]);
}
int sum = 0;
for (int i = 0; i < marks.Count; i++)
{
sum += marks[i];
}
double avg = sum / (double)marks.Count;
Console.WriteLine("المتوسط الحسابي = " + avg);
}
}
exitالمطلوب:
List<int> واستخدم while (true).exit توقف بـ break.int وأضفه للقائمة.using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int>();
while (true)
{
Console.Write("أدخل رقم أو exit: ");
string input = Console.ReadLine();
if (input == "exit") { break; }
numbers.Add(int.Parse(input));
}
int sum = 0;
for (int i = 0; i < numbers.Count; i++)
sum += numbers[i];
double avg = sum / (double)numbers.Count;
Console.WriteLine("المجموع = " + sum + " | المتوسط = " + avg);
}
}
List<string> + Containsالمطلوب:
List<string>.Add.Contains واطبع «موجود» أو «غير موجود».using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> names = new List<string>();
for (int i = 0; i < 4; i++)
{
Console.Write("اسم: ");
names.Add(Console.ReadLine());
}
Console.Write("ابحث عن: ");
string search = Console.ReadLine();
Console.WriteLine(names.Contains(search) ? "موجود" : "غير موجود");
}
}
المطلوب:
List<int>.Sort() لترتيب القائمة تصاعديًا.nums[0] والأكبر: nums[nums.Count - 1].using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> nums = new List<int>();
for (int i = 0; i < 5; i++)
{
Console.Write("رقم: ");
nums.Add(int.Parse(Console.ReadLine()));
}
nums.Sort();
Console.WriteLine("بعد الترتيب: " + string.Join(", ", nums));
Console.WriteLine("الأصغر: " + nums[0] + " | الأكبر: " + nums[nums.Count - 1]);
}
}
Student في List + متوسط العلاماتالمطلوب:
class Student مع string Name و int Mark.List<Student>.Student، اقرأ الاسم والعلامة من المستخدم، وأضفه للقائمة.using System;
using System.Collections.Generic;
class Student
{
public string Name;
public int Mark;
}
class Program
{
static void Main()
{
List<Student> students = new List<Student>();
for (int i = 0; i < 3; i++)
{
Student s = new Student();
Console.Write("اسم: ");
s.Name = Console.ReadLine();
Console.Write("علامة: ");
s.Mark = int.Parse(Console.ReadLine());
students.Add(s);
}
int sum = 0;
for (int i = 0; i < students.Count; i++)
{
Console.WriteLine(students[i].Name + " - " + students[i].Mark);
sum += students[i].Mark;
}
Console.WriteLine("المتوسط = " + (sum / (double)students.Count));
}
}
كل تمرين يركّز على مفهوم واحد أو اثنين. اتبع خطوات المطلوب بالترتيب. تذكّر: بدون Constructor — استخدم new ثم عيّن الحقول.
User + ثلاثة كائناتالمطلوب:
class User مع حقول عامة Name و Age.public void PrintInfo() تطبع الاسم والعمر.User (بدون Constructor).PrintInfo() لكل كائن.using System;
class User
{
public string Name;
public int Age;
public void PrintInfo()
{
Console.WriteLine(Name + " - " + Age);
}
}
class Program
{
static void Main()
{
User u1 = new User();
u1.Name = "Ahmad"; u1.Age = 20;
User u2 = new User();
u2.Name = "Sara"; u2.Age = 22;
User u3 = new User();
u3.Name = "Omar"; u3.Age = 19;
u1.PrintInfo();
u2.PrintInfo();
u3.PrintInfo();
}
}
BankAccount + تغليف الرصيدالمطلوب: بناء صنف BankAccount مع تغليف الرصيد:
FirstName، LastName.private int balance.SetBalance(int amount) — تضع القيمة في balance.GetBalance() — ترجع الرصيد.Main: أنشئ حسابًا، عيّن الاسم والرصيد، واطبع الرصيد.using System;
class BankAccount
{
public string FirstName;
public string LastName;
private int balance;
public void SetBalance(int amount)
{
balance = amount;
}
public int GetBalance()
{
return balance;
}
}
class Program
{
static void Main()
{
BankAccount acc = new BankAccount();
acc.FirstName = "Ahmad";
acc.LastName = "Saleh";
acc.SetBalance(5000);
Console.WriteLine(acc.FirstName + " " + acc.LastName);
Console.WriteLine("الرصيد: " + acc.GetBalance());
}
}
Employee + راتب مغلّفالمطلوب:
Employee: Name عام، salary خاص.SetSalary(int amount) — تضع القيمة في salary؛ GetSalary() — ترجع الراتب.List<Employee>.GetSalary().using System;
using System.Collections.Generic;
class Employee
{
public string Name;
private int salary;
public void SetSalary(int amount)
{
salary = amount;
}
public int GetSalary()
{
return salary;
}
}
class Program
{
static void Main()
{
List<Employee> staff = new List<Employee>();
Employee e1 = new Employee();
e1.Name = "Ali"; e1.SetSalary(3000);
staff.Add(e1);
Employee e2 = new Employee();
e2.Name = "Sara"; e2.SetSalary(3500);
staff.Add(e2);
Employee e3 = new Employee();
e3.Name = "Omar"; e3.SetSalary(2800);
staff.Add(e3);
for (int i = 0; i < staff.Count; i++)
Console.WriteLine(staff[i].Name + " : " + staff[i].GetSalary());
}
}
Person + Teacher + Studentالمطلوب: وراثة بسيطة:
Person: Name، Age، ودالة Introduce() تطبع الاسم والعمر.Teacher : Person يضيف string Subject.Student : Person يضيف int Grade.Introduce() ثم اطبع الحقل الإضافي).using System;
class Person
{
public string Name;
public int Age;
public void Introduce()
{
Console.WriteLine("أنا " + Name + " عمري " + Age);
}
}
class Teacher : Person
{
public string Subject;
}
class Student : Person
{
public int Grade;
}
class Program
{
static void Main()
{
Teacher t = new Teacher();
t.Name = "Mona"; t.Age = 35; t.Subject = "CS";
t.Introduce();
Console.WriteLine("المادة: " + t.Subject);
Student s1 = new Student();
s1.Name = "Hadi"; s1.Age = 16; s1.Grade = 90;
s1.Introduce();
Student s2 = new Student();
s2.Name = "Lama"; s2.Age = 17; s2.Grade = 95;
s2.Introduce();
}
}
abstract Shape + مساحاتالمطلوب: تجريد + تنفيذ:
Shape مع Color و abstract double GetArea().Rectangle: Width، Height — GetArea() = العرض × الارتفاع.Circle: Radius — GetArea() = 3.14 × نصف القطر².Main: أنشئ Rectangle و Circle (متغيرات من نوع الابن)، عيّن القيم، واطبع مساحة كل شكل.using System;
abstract class Shape
{
public string Color;
public abstract double GetArea();
}
class Rectangle : Shape
{
public double Width;
public double Height;
public override double GetArea() { return Width * Height; }
}
class Circle : Shape
{
public double Radius;
public override double GetArea() { return 3.14 * Radius * Radius; }
}
class Program
{
static void Main()
{
Rectangle r = new Rectangle();
r.Color = "أحمر"; r.Width = 4; r.Height = 5;
Circle c = new Circle();
c.Color = "أزرق"; c.Radius = 3;
Console.WriteLine(r.GetArea());
Console.WriteLine(c.GetArea());
}
}
interface IPrintableالمطلوب:
interface IPrintable مع void PrintInfo().Book: Title، Author — PrintInfo() يطبع بيانات الكتاب.Movie: Title، Duration — PrintInfo() يطبع بيانات الفيلم.List<IPrintable>.Book و Movie، عيّن الحقول، وأضفهما للقائمة.PrintInfo() لكل عنصر.using System;
using System.Collections.Generic;
interface IPrintable
{
void PrintInfo();
}
class Book : IPrintable
{
public string Title;
public string Author;
public void PrintInfo()
{
Console.WriteLine("كتاب: " + Title + " - " + Author);
}
}
class Movie : IPrintable
{
public string Title;
public int Duration;
public void PrintInfo()
{
Console.WriteLine("فيلم: " + Title + " (" + Duration + " دقيقة)");
}
}
class Program
{
static void Main()
{
List<IPrintable> items = new List<IPrintable>();
Book b = new Book();
b.Title = "OOP"; b.Author = "Abdullah";
items.Add(b);
Movie m = new Movie();
m.Title = "Inception"; m.Duration = 148;
items.Add(m);
for (int i = 0; i < items.Count; i++)
items[i].PrintInfo();
}
}
Animal + List<Animal>المطلوب: Overriding + List:
Animal مع Name و virtual void MakeSound().Dog و Cat يعيدان تعريف MakeSound() بأصوات مختلفة.Dog و Cat (من نوع الابن)، عيّن الأسماء.List<Animal>.MakeSound() — لاحظ اختلاف الصوت لكل كائن.using System;
using System.Collections.Generic;
class Animal
{
public string Name;
public virtual void MakeSound()
{
Console.WriteLine("...");
}
}
class Dog : Animal
{
public override void MakeSound() { Console.WriteLine(Name + ": Woof!"); }
}
class Cat : Animal
{
public override void MakeSound() { Console.WriteLine(Name + ": Meow!"); }
}
class Program
{
static void Main()
{
List<Animal> zoo = new List<Animal>();
Dog d = new Dog(); d.Name = "Rex";
Cat c = new Cat(); c.Name = "Mimi";
zoo.Add(d); zoo.Add(c);
for (int i = 0; i < zoo.Count; i++)
zoo[i].MakeSound();
}
}
IPrintable + ISaveableالمطلوب: واجهتان على صنف واحد:
interface IPrintable مع PrintInfo().interface ISaveable مع SaveToFile().Product : IPrintable, ISaveable مع Name و Price.PrintInfo() لطباعة الاسم والسعر.SaveToFile() لطباعة رسالة «تم حفظ …».Main: أنشئ منتجًا، عيّن البيانات، اطبع واحفظ.using System;
interface IPrintable { void PrintInfo(); }
interface ISaveable { void SaveToFile(); }
class Product : IPrintable, ISaveable
{
public string Name;
public double Price;
public void PrintInfo()
{
Console.WriteLine(Name + " - " + Price);
}
public void SaveToFile()
{
Console.WriteLine("تم حفظ " + Name);
}
}
class Program
{
static void Main()
{
Product p = new Product();
p.Name = "Laptop"; p.Price = 1200;
p.PrintInfo();
p.SaveToFile();
}
}
تمارين تجمع List مع كل ركائز OOP في برنامج واحد.
المطلوب: نظام مدرسة مصغّر:
Person مع Name و virtual void ShowRole().Student : Person مع Grade — ShowRole() يطبع اسم الطالب وعلامته.Teacher : Person مع Subject — ShowRole() يطبع اسم المعلّم ومادته.List<Person> بـ Add.ShowRole() لكل عنصر — لاحظ تعدد الأشكال.using System;
using System.Collections.Generic;
class Person
{
public string Name;
public virtual void ShowRole()
{
Console.WriteLine(Name + ": شخص");
}
}
class Student : Person
{
public int Grade;
public override void ShowRole()
{
Console.WriteLine(Name + ": طالب - علامة " + Grade);
}
}
class Teacher : Person
{
public string Subject;
public override void ShowRole()
{
Console.WriteLine(Name + ": معلم - " + Subject);
}
}
class Program
{
static void Main()
{
List<Person> people = new List<Person>();
Student s1 = new Student(); s1.Name = "Hadi"; s1.Grade = 88;
Student s2 = new Student(); s2.Name = "Lama"; s2.Grade = 95;
Teacher t1 = new Teacher(); t1.Name = "Ali"; t1.Subject = "Math";
Teacher t2 = new Teacher(); t2.Name = "Mona"; t2.Subject = "CS";
people.Add(s1); people.Add(s2); people.Add(t1); people.Add(t2);
for (int i = 0; i < people.Count; i++)
people[i].ShowRole();
}
}
المطلوب:
abstract Shape مع GetArea() و الأصناف Rectangle و Circle.List<Shape>.GetArea() لكل شكل في متغير total.using System;
using System.Collections.Generic;
abstract class Shape
{
public abstract double GetArea();
}
class Rectangle : Shape
{
public double Width, Height;
public override double GetArea() { return Width * Height; }
}
class Circle : Shape
{
public double Radius;
public override double GetArea() { return 3.14 * Radius * Radius; }
}
class Program
{
static void Main()
{
List<Shape> shapes = new List<Shape>();
Rectangle r = new Rectangle(); r.Width = 4; r.Height = 5;
Circle c1 = new Circle(); c1.Radius = 2;
Circle c2 = new Circle(); c2.Radius = 3;
shapes.Add(r); shapes.Add(c1); shapes.Add(c2);
double total = 0;
for (int i = 0; i < shapes.Count; i++)
total += shapes[i].GetArea();
Console.WriteLine("مجموع المساحات = " + total);
}
}
المطلوب: مشروع مصغّر يجمع List + Interface + Encapsulation:
IPrintable وصنف Book (Title, Author) ينفّذ PrintInfo().List<IPrintable> وأضف كتابين على الأقل.BankAccount مع OwnerName ورصيد private و SetBalance / GetBalance.List<BankAccount> وأضف حسابين بأرصدة مختلفة.PrintInfo() لكل كتاب.GetBalance() واطبع المجموع.using System;
using System.Collections.Generic;
interface IPrintable
{
void PrintInfo();
}
class Book : IPrintable
{
public string Title;
public string Author;
public void PrintInfo()
{
Console.WriteLine("كتاب: " + Title + " - " + Author);
}
}
class BankAccount
{
public string OwnerName;
private int balance;
public void SetBalance(int amount)
{
balance = amount;
}
public int GetBalance() { return balance; }
}
class Program
{
static void Main()
{
List<IPrintable> library = new List<IPrintable>();
Book b1 = new Book(); b1.Title = "C#"; b1.Author = "Abdullah";
Book b2 = new Book(); b2.Title = "OOP"; b2.Author = "Sara";
library.Add(b1); library.Add(b2);
List<BankAccount> accounts = new List<BankAccount>();
BankAccount a1 = new BankAccount(); a1.OwnerName = "Ahmad"; a1.SetBalance(5000);
BankAccount a2 = new BankAccount(); a2.OwnerName = "Mona"; a2.SetBalance(3000);
accounts.Add(a1); accounts.Add(a2);
Console.WriteLine("=== المكتبة ===");
for (int i = 0; i < library.Count; i++)
library[i].PrintInfo();
int totalBalance = 0;
for (int i = 0; i < accounts.Count; i++)
totalBalance += accounts[i].GetBalance();
Console.WriteLine("=== مجموع الأرصدة = " + totalBalance);
}
}