مقدمة إلى Class and Objects في C#
ماذا تعني البرمجة الموجهة للكائنات OPP..؟!! وكيف يتم انشاء الـ Class و Object من خلال لغة C#..؟!! ماهي خصائص Properties متغيرات الـ Class وكيف تعمل مع الـ Class و Object..؟؟! و ما هو الـ Constructor وما طريقة استخدامه مع الـ Class و Object..؟!!
تعتبر البرمجة الموجهة للكائنات (OOP) نهج قوي في عالم البرمجة يسمح بتنظيم البرامج وتطويرها بطريقة هيكلية ومنظمة. واحدة من اللغات التي تدعم OOP بشكل شامل هي لغة سي شارب ( C# ). ويتم استخدام الفئة (Class) والكائن (Object) كأساس للبرمجة الموجهة للكائنات OOP. في هذا المقال سنتعرف على طريقة العمل مع الـ Class و Object يواسطة تعليمات لغة سي شارب . لنبدأ
في هذا المقال سنتعرف على :
- نظرة على البرمجة الموجهة للكائنات OOP.
- الفئات والكائنات Classes and Objects.
- الفئات والكائنات Classes and Objects في C# .
- الخصائصProperties وعملها الـ Class & Object.
- مفهوم الـ Constructor واستخدامه مع Class & Object.
نظرة على البرمجة الموجهة للكائنات OOP
البرمجة الموجهة للكائنات (OOP) الـ OOP هو اختصار لـ Object-Oriented Programming اي البرمجة الموجهة للكائنات ماذا يعني هذا..؟
البرمجة الموجهة للكائنات Object-Oriented Programming هي نهج برمجي يتركز على تصميم التطبيق بشكل يستخدم الكائنات Objects والفئات Classes لتمثيل العناصر في التطبيق.
تتم عملية البرمجة في البرمجة الموجهة للكائنات OOP من خلال بناء فئات Classes التي يكون لها سمات Attributes أو خصائص Properties ومجموعة دوال Functions قد تُسمى Methods. ثم من الفئات يتم إنشاء Objects لهذه الفئات classes للتمثيل قيم البيانات.بمعنى الـ Object هو نسخة Class معين بقيم حقيقة.
ومن مميزات البرمجة الموجهة للكائنات OOP البرمجة الموجهة بالكائنات:
- توفير بنية واضحة للبرامج.
- سرعة سهولة التنفيذ.
- تعمل على مبدأ (DRY -Don't Repeat Yourself) وهذا يعني بالمحافظة على عدم تكرار الكود مما يجعل من السهل تعديل الكود او اصلاح الاخطاء.
- إمكانية إنشاء تطبيقات كاملة قابلة لإعادة الاستخدام مع كود أقل ووقت تطوير أقصر.
وتعتمد البرمجة الموجهة بالكائنات OOP على عدة مبادئ:
- التغليف Encapsulation طريقة للتحكم بالوصول الفئات والكائنات Classes and Objects وتعني التحكم بالوصول المباشر إلى الدوال Methods المتغيرات Instance variables الموجودة في الـ Class،يسمح هذا بالتحكم في الوصول إلى البيانات وتنفيذ العمليات المطلوبة فقط
- الوراثة Inheritance الوراثة هي إنشاء class جديد يستند إلى Class قائم بالفعل. وتعني امكانية التوريث بين الـ Classes أي كل class فرعي Sub class يرث كل عناصر الـ Super Class.
- تعدد الأشكال Polymorphism ويعني السماح بتعددية تعريف واجهات (Interfaces) أي امكانية وجود نفس الواجهة مع اختلاف النوع مثل Method Overload.
وتدعم عدد من لغات البرمجة أسلوب البرمجة الموجهة للكائنات OOP مثل: Python, Java, JavaScript وبالطبع C# .(اقرأ أكثر عن هذا النهج البرمجة في مقال مقال عن البرمجة الموجهة للكائنات Object-Oriented Programming).
باستخدام البرمجة الموجهة للكائنات OOP، يمكن للمطورين بناء تطبيقات قوية وقابلة للتطوير بسهولة. يتيح لهم هذا النهج تجزئة البرنامج إلى وحدات صغيرة ومستقلة تتفاعل مع بعضها البعض. بالإضافة إلى ذلك، يسهل إعادة استخدام الكود وتوسيع البرامج بإضافة صفحات جديدة أو تغيير الصفحات الموجودة.
الفئات والكائنات Classes and Objects
تعتبر الفئات والكائنات Classes and Objects الجزء الرئيسي من البرمجة الموجهة بالكائنات OOP. فعندما نقول Class نتكلم عن نموذج للتعامل مع البيانات من متغيرات تمثل السمات او الخصائص Attributes or Properties ودوال Methods تعمل مع بعضها البعض لتكون اسلوب هذا النموذج في العمل مع البيانات. بينما يعتبر الـ Object التمثيل الحققي لهذه البيانات لنأخذ أمثلة حتى يتضح الأمر:
المثال الأول :
- لعمل نموذج لبيانات الطلاب في المدرسة نقوم ببناء Class يحتوي على البيانات المطلوبة من كل طالب وطرق التعامل معها.
- تُمثل البيانات بـ Attributes اسم الطالب، رقم الطالب تاريخ الميلاد ... الخ.
- وتمثل طرق التعامل مع بيانات الطالب بدوال Methods تعمل مع التغيير في بيانات الطالب مثل المرحلة الدراسية والمواد المسجلة لهذه المرحلة ودرجات الطالب ومعدله ..الخ.
- ثم نقوم بعمل Object لهذا النموذج وهو نسخة من هذا الـ Class ولكن ببيانات حقيقية أي أن كل طالب من الطلاب له Object خاص يمثل بيانات هذا الطالب فقط.
المثال الثاني:
اذا اردنا عمل Class لتمثيل بيانات سيارة فالسياره لها نوع ورقم ولون وسرعة ويكون ال Object يمثل هذه البيانات لسيارة معينة و يوضح الشكل التالي الفكرة:
Classes and Objects في C#
في لغة سي شارب ( C# )، يتم استخدام الفئة (Class) والكائن (Object) كأساس للبرمجة الموجهة للكائنات. يُعتبر الـ Class هو الهيكل الأساسي الذي يحدد الخصائص Properties و الوظائف Methods المشتركة لمجموعة من الكائنات Objects المرتبطة. بينما يُمثِّل الكائن حالة محددة من الفئة ويتم إنشاؤه وتعامله في البرنامج.
لإنشاء Class في C# نستخدم الكلمة المحجوزة class للإعلان عنه يتبعها اسم الـ class ويفضل ان يكون أو حرف من الاسم كبير ثم الأقواس {…} لتحدد حدود الـ Class.
مثال:
سنقوم بإنشاء Class بإسم Students للطلاب ونرى كيف يتم استدعاء الـ Method الموجودة فيه بواسطة الـ Class الرئيسي School (نعني بالـ Class الرئيسي الـ Class الذي يحتوي على الدالة Main )
Students class
namespace App
{
public class Students {
//display a welcome message to the School System user
public static void WelcomeMessage(string studentName)
{
Console.WriteLine("Welcome To School System: {0}", studentName);
}
}
}
School class
namespace App
{
class School
{
public static void Main(string[] args)
{
Console.Write("Please type your name: ");
string name = Console.ReadLine();
//calling the public static method from the class
Students.WelcomeMessage(name);
}
}
}
المثال بالكامل هنا.
في المثال رأينا كيف تم استخدام الداله WelcomeMessage() الموجودة في Students Class وتمثل طريقة الاستدعاء هذه جميع الدوال من نوع static والتي يكون طريقة الوصول لها (Access Modifier) مخصصة بـ public.
ماذا لو لم تكن الدالة static هنا لابد ان ننشئ Object للـ class من خلال هذا الـ Object سنتمكن سيتوفر لدينا نسخة من الـ Class التي سنتعامل معها ليكون كالتالي :
Students class
namespace App
{
public class Students {
//display a welcome message to the School System user
public void WelcomeMessage(string studentName)
{
Console.WriteLine("Welcome School System: {0}", studentName);
}
}
}
School class
namespace App
{
class School
{
public static void Main(string[] args)
{
//Calling the public non-static method
//First, must create an object from the class
// The object named student1
Students student1 = new Students();
//Then calling the method by the object name
student1.WelcomeMessage("Marum");
//The second object named student2
Students student2 = new Students();
student2.WelcomeMessage("Noor");
}
}
}
المثال بالكامل هنا.
وهكذا يتم بناء Object من خلال كتابة اسم الـ Class ثم اسم الـ Object ثم معامل التعيين والكلمة المجوزة new ثم استدعاء للـ Constructor.
ليس فقط الدوال التي يمكن الوصول لها من خلال Object بل حتى كل السمات (class Attributes) التي تكون طريقة الوصول Access Modifier لها بـ public يمكن الوصول إليها.
لنرى مثال:
Students class
namespace App
{
public class Students {
//A class attribute declaration
public string name;
public void WelcomeMessage(string studentName)
{
Console.WriteLine("Welcome School System: {0}", studentName);
}
}
}
School class
namespace App
{
class School
{
public static void Main(string[] args)
{
Students student1 = new Students();
//Assigning a value to the name attribute in the class student1
student1.name = "Mona";
student1.WelcomeMessage(student1.name);
}
}
}
المثال بالكامل هنا.
الـ Property وعملها الـ Class & Object
عندما نمثل الـ Class Attributes بمتغيرات على مستوى الـ Class حيث أن كل Object لهذا الـ Class نسخته الخاصة من هذه المتغيرات، نسمي هذه المتغيرات بـ Instance Variables. و إ ن لم يحدد صلاحية الوصول ( Access Modifier) للـمتغيرات الـ Class Instance Variables) فإنها تُعين افتراضياً بـ public .
ويعني أن يتم تعين الـ Access Modifier بـ public ان يكون هذا المتغير عام ، أي متاح للوصول من خارج الـ Class. أما عن تعين المتغير بـ private أن يكون المغير خاص فلا يسمح بالوصول له من خارج الـ Class، الـ private نوع من الـ Access Modifier ، ويمكن الوصول الى المتغير الـ private من خارج الـ class بواسطة عدة طُرق منها استخدام الخواص properties حيث يتم انشاء خاصية (property) لكل متغير private .
ماهي الخاصية Property للمغير الـ Class الخاصية من عناصر الـ class وترتبط بمتغير معين من متغيرات الـ Class وعادة تاخذ الخاصية اسم المتغير ولكن يكون الحرف الاول كبير. وبالطبع ستكون صلاحية الوصول لها public وتحتوي الخاصية Property على أداتين هما :
- get Accessor وتسخدم لإرجاع قيمة المتغير للـ Object.
- set Accessor وتستخدم لإسناد القيمة المرسلة من الـ Object للمتغير.
المثال التالي يوضح طريقة استخدام الخاصية Property مع متغير الـ Class (Instance Variable) في المثال في Students class ننشئ متغير private وننشئ Property خاصة به.
namespace App
{
public class Students {
public string name;
private int id;
//Declaration a property
public int Id
{
get{
return id;
}
set{
id = value ;
}
}
//OR we can use auto-implemented property id implicitly creates
//public int Id{ get; set;}
public void WelcomeMessage(string studentName ,int ID)
{
Console.WriteLine("Welcome School System: {0}\n your ID is {1}", studentName ,ID);
}
}
}
Value هنا هي كلمة محجوزة تعبر عن القيمة في الـ Object أي أسند هذه القيمة الى المتغير الخاص بهذه الـ Property ، ثم في الدالة Main() نقوم بإنشاء الـ Object ونرسل القيم ونستدعي دالة الطباعة، كتالي:
namespace App
{
class School
{
public static void Main(string[] args)
{
Students student1 = new Students();
student1.name = "Mona";
//Access via property
student1.Id = 1;
student1.WelcomeMessage(student1.name ,student1.Id);
}
}
}
المثال بالكامل هنا.
في المثال استخدمنا الصيغة العادية لإنشاء الـ Property وهنالك طريقة مختصرة وهي استخدام الكود المضمن التلقائي لكل من get و set كتب هذه الصيغة في المثال على شكل تعليق.
مفهوم الـ Constructor واستخدامه مع Class & Object
ان لكل متغير من الـ Instance Variables في الـ Class قيمة ابتدائية افتراضية ويحدد نوع المتغير هذه القمية ففي المتغيرات النصية تكون القيمة null المتغيرات الرقمية تكون 0 و المتغيرات المنطقية تكون false.
ولتهيئة القيم الافتراضية للـ Instance Variables في الـ Class الى قيم معينة او ارسال قيم للـ Instance Variables نستخدم الـ Constructor فما هو:
- الـ Constructor شبية بالدالة يحمل نفس اسم الـ Class يمكن أن يكون له قائمة من الـ Parameters.
- يستدعى الـ Constructor تلقائياًعند إنشاء الـ Object.
- الـ Constructor لايرجع قيمة.
- يمكن انشاء اكثر من Constructor للـ Class الواحد وهي في الحال تعمل كا Overload أي أنها تتشابه في الاسم وتختلف في الـ Parameters.
يوضح المثال التالي طريقة انشاء الـ Constructor في الـ Class واستخدامه مع الـ Object :
Students class
namespace App
{
public class Students {
public string name;
private int id;
public int ID{ get; set;}
//Constructor 1 declaration to assigning the default values
public Students()
{
name = "No name ";
ID = 0;
}
//Constructor 2 declaration, if the object send value for name
public Students(string Name)
{ name = Name;}
//Constructor 3 declaration, if the object send values for name and id
public Students( string Name, int Id){
name = Name;
ID = Id;
}
public void WelcomeMessage(string studentName ,int ID)
{
Console.WriteLine("Welcome School System: {0}\n your ID is {1}", studentName ,ID);
}
}
}
School class
namespace App
{
class School
{
public static void Main(string[] args)
{
//Here the constructor of default values will calling
Students student1 = new Students();
//Here the constructor of both values will calling
Students student2 = new Students("Maram", 1);
//Here the constructor of name value will calling
Students student3 = new Students ("Amal");
Console.WriteLine( "The student name is {0}, and the id number is {1}",student1.name, student1.ID);
Console.WriteLine("The student name is {0}, and the id number is {1}",student2.name,student2.ID);
Console.WriteLine("The student name is {0}, and the id number is {1}",student3.name, student3.ID);
}
}
}
المثال بالكامل هنا.
مما سبق نرى تحقق مفهوم التغليف Encapsulation في البرمجة الموجهة بالكائنات OOP في طريقة استخدام كلاً من الـ Property والـ Constructor حيث يتم تغيف وحفظ متغيرات الـ Class من الوصول المباشر.
إلى هنا ينتهي هذا المقال الذي تعرفنا فيه على البرمجة الموجهة للكائنات OOP و مفهوم الـ Class و Object مع أمثلة تطبيقية من تعليمات C# كما تطرق المقال لشرح المفهوم الـ Property و Constructor مع الأمثلة. إن فهم المفاهيم الأساسية للكائنات الفئات (Class & Objects) في C#يمثل خطوة هامة نحو إتقان هذه اللغة وبناء برامج قوية ومتقدمة. من خلال الاستفادة من هذه المفاهيم وتطبيقها بشكل صحيح، يمكن للمطورين إنشاء برامج قابلة للصيانة وقابلة للتوسع، وتحقيق الأهداف المرجوة بطريقة فعالة ومنظمة.