الحقول والدوال الساكنة (Static)
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 12 من 70.
حتى الآن، كل حقل وطريقة قمنا بإنشائها تنتمي إلى كائنات فردية. ولكن في بعض الأحيان تحتاج إلى بيانات أو سلوك ينتمي إلى الفئة نفسها، ويكون مشتركاً بين جميع النسخ. هنا يأتي دور الكلمة المفتاحية static.
يتم مشاركة الحقل الثابت (static field) بواسطة جميع كائنات الفئة. توجد نسخة واحدة فقط، بغض النظر عن عدد المثيلات التي تقوم بإنشائها:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}في كل مرة يتم فيها إنشاء Player جديد، يزداد TotalPlayers. يتشارك جميع اللاعبين في هذا العداد نفسه.
تنتمي الـ static method إلى الفئة (class) ويمكن استدعاؤها دون إنشاء كائن:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// يتم استدعاؤه على الفئة، وليس على مثيل
int result = Calculator.Add(5, 3);لاحظ أنك تقوم بالوصول إلى الأعضاء الثابتة (static members) باستخدام اسم الفئة، وليس مرجع كائن. لا يمكن للدوال الثابتة (Static methods) الوصول إلى حقول المثيل (instance fields) أو استخدام this، لأنها لا تنتمي إلى أي كائن محدد.
لقد استخدمت بالفعل الأعضاء الساكنة (static members) دون أن تدرك ذلك. Console.WriteLine() هي دالة ساكنة، و Math.PI هو حقل ساكن.
التحدي
سهللنقم ببناء نظام لتتبع الطلبات يستخدم الأعضاء الثابتة (static members) لتتبع جميع الطلبات التي يتم إجراؤها عبر تطبيقك.
ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:
Order.cs: قم بتعريف فئةOrderداخل مساحة الأسماءOrderSystem. يجب أن يكون لكل طلب خاصية مثيل (instance property) باسمOrderId(من نوع int) وCustomerName(من نوع string). يجب أن تتبع الفئة أيضاً العدد الإجمالي للطلبات التي تم إنشاؤها باستخدام حقل ثابتTotalOrders، وتوفر طريقة ثابتةGetNextOrderId()تُرجع معرف الطلب التالي المتاح (بدءاً من 1). يجب أن يقبل المنشئ (constructor) اسم العميل، ويقوم تلقائياً بتعيين معرف الطلب باستخدام الطريقة الثابتة، ويزيد إجمالي عدد الطلبات.Program.cs: في ملفك الرئيسي، قم بإنشاء طلبات بناءً على المدخلات واعرض تفاصيلها جنباً إلى جنب مع إجمالي عدد الطلبات.
ستتلقى مدخلين يمثلان أسماء العملاء لطلبين منفصلين.
لكل طلب، قم بطباعة تفاصيله بهذا التنسيق:
Order #{OrderId} - Customer: {CustomerName}بعد إنشاء كلا الطلبين، قم بطباعة العدد الإجمالي:
Total Orders: {TotalOrders}على سبيل المثال، إذا كانت المدخلات هي Alice و Bob، يجب أن يكون الناتج:
Order #1 - Customer: Alice
Order #2 - Customer: Bob
Total Orders: 2ورقة مرجعية
تُنشئ الكلمة المفتاحية static أعضاءً ينتمون إلى الفئة (class) نفسها بدلاً من الانتماء إلى مثيلات (instances) فردية.
تتم مشاركة الحقول الثابتة (Static fields) عبر جميع كائنات الفئة. توجد نسخة واحدة فقط بغض النظر عن عدد المثيلات التي تم إنشاؤها:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}تنتمي الأساليب الثابتة (Static methods) إلى الفئة ويمكن استدعاؤها دون إنشاء كائن:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// Called on the class, not an instance
int result = Calculator.Add(5, 3);يتم الوصول إلى الأعضاء الثابتة باستخدام اسم الفئة، وليس مرجع الكائن. لا يمكن للأساليب الثابتة الوصول إلى حقول المثيلات أو استخدام this لأنها لا تنتمي إلى أي كائن محدد.
تشمل الأمثلة الشائعة للأعضاء الثابتة Console.WriteLine() (أسلوب ثابت) و Math.PI (حقل ثابت).
جرّب بنفسك
using System;
using OrderSystem;
class Program
{
public static void Main(string[] args)
{
// قراءة أسماء العملاء
string customer1 = Console.ReadLine();
string customer2 = Console.ReadLine();
// TODO: إنشاء كائنين من النوع Order بأسماء العملاء
// TODO: طباعة تفاصيل كل طلب بالتنسيق التالي:
// Order #{OrderId} - Customer: {CustomerName}
// TODO: طباعة إجمالي عدد الطلبات بالتنسيق التالي:
// Total Orders: {TotalOrders}
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injection