الفئات الساكنة (Static Classes)
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 13 من 70.
عندما يحتوي صنف (class) على أعضاء ثابتة (static members) فقط ولا تحتاج أبداً إلى إنشاء مثيلات (instances) منه، يمكنك التصريح عن الصنف بأكمله كـ static. يخبر هذا المترجم (compiler) بأنه لا يمكن إنشاء مثيل من الصنف وأنه لا يمكنه احتواء سوى أعضاء ثابتة.
public static class MathHelper
{
public static double Pi = 3.14159;
public static int Square(int number)
{
return number * number;
}
public static int Add(int a, int b)
{
return a + b;
}
}تستخدم الفئات الثابتة بنفس الطريقة التي تستخدم بها الأعضاء الثابتة، وذلك من خلال استدعائها مباشرةً باستخدام اسم الفئة:
int result = MathHelper.Square(5);
double pi = MathHelper.Pi;تتمتع الفئات الثابتة (Static classes) بقيود مهمة. لا يمكنك إنشاء مثيل باستخدام new، ولا يمكن أن تحتوي على مشيدات مثيل، ولا يمكن توريثها. يمكنها فقط أن تحتوي على حقول وخصائص وطرق ثابتة (static).
تعد فئات Console و Math التي كنت تستخدمها أمثلة مثالية على الفئات الساكنة (static classes). فهي توفر وظائف مساعدة دون الحاجة إلى حالة الكائن (object state). الفئات الساكنة مثالية لتجميع الأساليب المساعدة المرتبطة أو الثوابت التي لا تتطلب أي بيانات خاصة بنسخة معينة.
التحدي
سهللنقم ببناء أداة مساعدة لتحويل درجات الحرارة باستخدام فئة ثابتة (static class) لتجميع الطرق المساعدة (helper methods) ذات الصلة التي لا تتطلب أي حالة للكائن (object state).
ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:
TemperatureConverter.cs: قم بتعريف فئة ثابتة تسمىTemperatureConverterداخل مساحة الأسماءUtilities. يجب أن تحتوي هذه الفئة على:- حقل ثابت (static field) باسم
AbsoluteZeroCelsiusوقيمته-273.15 - طريقة ثابتة (static method) باسم
CelsiusToFahrenheit(double celsius)تقوم بتحويل الدرجة المئوية إلى فهرنهايت باستخدام الصيغة:(celsius * 9 / 5) + 32 - طريقة ثابتة باسم
FahrenheitToCelsius(double fahrenheit)تقوم بتحويل الفهرنهايت إلى درجة مئوية باستخدام الصيغة:(fahrenheit - 32) * 5 / 9 - طريقة ثابتة باسم
IsAboveAbsoluteZero(double celsius)ترجعtrueإذا كانت درجة الحرارة أعلى من الصفر المطلق
- حقل ثابت (static field) باسم
Program.cs: في ملفك الرئيسي، استخدم الفئة الثابتة لإجراء التحويلات. اقرأ قيمة درجة الحرارة بالدرجة المئوية من المدخلات، ثم اعرض التحويلات والتحقق من الصحة.
ستتلقى مدخلاً واحداً: قيمة درجة الحرارة بالدرجة المئوية.
اطبع النتائج بهذا التنسيق:
{celsius}C = {fahrenheit}F
{fahrenheit}F = {convertedBack}C
Above Absolute Zero: {True/False}
Absolute Zero: {AbsoluteZeroCelsius}Cعلى سبيل المثال، إذا كان المدخل 25، يجب أن يكون المخرج:
25C = 77F
77F = 25C
Above Absolute Zero: True
Absolute Zero: -273.15Cتذكر أنه لا يمكن إنشاء كائنات من الفئات الثابتة (static classes) - ستستدعي جميع الطرق مباشرة باستخدام اسم الفئة مثل TemperatureConverter.CelsiusToFahrenheit(25).
ورقة مرجعية
يمكن للفئة static أن تحتوي فقط على أعضاء ثابتة ولا يمكن إنشاء مثيل لها. تُستخدم لتجميع الأساليب المساعدة والثوابت ذات الصلة التي لا تتطلب حالة للكائن.
public static class MathHelper
{
public static double Pi = 3.14159;
public static int Square(int number)
{
return number * number;
}
public static int Add(int a, int b)
{
return a + b;
}
}يتم الوصول إلى أعضاء الفئة الثابتة مباشرةً عبر اسم الفئة:
int result = MathHelper.Square(5);
double pi = MathHelper.Pi;قيود الفئات الثابتة (static classes):
- لا يمكن إنشاء مثيل لها باستخدام
new - لا يمكن أن تحتوي على منشئات مثيل (instance constructors)
- لا يمكن توريثها
- يمكن أن تحتوي فقط على حقول وخصائص وأساليب ثابتة (static)
تشمل الأمثلة الشائعة فئتي Console و Math، اللتين توفران وظائف مساعدة دون الحاجة إلى حالة للكائن.
جرّب بنفسك
using System;
using Utilities;
class Program
{
public static void Main(string[] args)
{
// قراءة درجة الحرارة بالدرجة المئوية
double celsius = Convert.ToDouble(Console.ReadLine());
// TODO: استخدم الطرق الثابتة (static methods) في TemperatureConverter من أجل:
// 1. تحويل الدرجة المئوية إلى فهرنهايت
// 2. تحويل الفهرنهايت مرة أخرى إلى درجة مئوية
// 3. التحقق مما إذا كانت درجة الحرارة أعلى من الصفر المطلق
// 4. الحصول على ثابت الصفر المطلق
// TODO: اطبع النتائج بالتنسيق المطلوب:
// {celsius}C = {fahrenheit}F
// {fahrenheit}F = {convertedBack}C
// Above Absolute Zero: {True/False}
// Absolute Zero: {AbsoluteZeroCelsius}C
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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