Menu
CoddyTech
flag Ar iconالعربيةdown icon

الخصائص من أجل التغليف

جزء من قسم البرمجة كائنية التوجه في رحلة C# على Coddy. الدرس 32 من 70.

الخصائص هي الأداة الأساسية لتطبيق التغليف في C#. بدلًا من إتاحة الحقول مباشرةً، أَحِطها بخصائص تتحكم في كيفية الوصول إلى البيانات وتعديلها.

يجمع هذا النمط بين حقل خاص وخاصية عامة تتضمن تحققًا أو منطقًا في موصّلاتها:

public class Temperature
{
    private double celsius;
    
    public double Celsius
    {
        get { return celsius; }
        set
        {
            if (value < -273.15)
                celsius = -273.15;  // الصفر المطلق هو الحد الأدنى
            else
                celsius = value;
        }
    }
}

الآن لا يمكن للكود الخارجي ضبط درجة حرارة مستحيلة. تعمل الخاصية كحارس بوابة، مما يضمن بقاء كائنك دائمًا في حالة صالحة. هذا هو التغليف عمليًا - حيث تكون البيانات الداخلية محمية مع بقائها متاحة عبر واجهة خاضعة للتحكم.

يمكنك أيضًا استخدام الخصائص لحساب القيم أو تنفيذ آثار جانبية:

public double Fahrenheit
{
    get { return celsius * 9 / 5 + 32; }
    set { celsius = (value - 32) * 5 / 9; }
}

يرى العالم الخارجي خاصيتين، لكن يوجد داخليًا حقل واحد فقط. تتيح لك الخصائص تغيير تفاصيل التنفيذ دون الإخلال بالكود الذي يستخدم صفّك - وهذه ميزة أساسية للتغليف السليم.

challenge icon

التحدي

سهل

لننشئ نظامًا لمخزون المنتجات يستخدم الخصائص لحماية سلامة البيانات. ستنشئ صنفًا لا يمكن أن تصبح أسعاره سالبة أبدًا، وتظل كمياته دائمًا ضمن الحدود الصحيحة — موضحًا كيف تعمل الخصائص كحراس لبياناتك.

ستنظم التعليمات البرمجية عبر ملفين:

  • Product.cs: أنشئ صنفًا Product في مساحة الأسماء Inventory لإدارة معلومات المنتج والتحقق من صحتها من خلال الخصائص. يجب أن يتضمن منتجك:
    • حقلًا خاصًا price (عدد عشري) مع خاصية عامة Price تضمن ألا يقل السعر عن 0 أبدًا — إذا حاول أحدهم تعيين سعر سالب، فيجب تخزين 0 بدلًا منه
    • حقلًا خاصًا quantity (عدد صحيح) مع خاصية عامة Quantity تحافظ على القيم بين 0 و1000 — تصبح القيم الأقل من 0 مساوية لـ 0، والقيم الأعلى من 1000 مساوية لـ 1000
    • خاصية عامة مُنفّذة تلقائيًا Name (سلسلة نصية)
    • خاصية محسوبة للقراءة فقط TotalValue تعيد Price * Quantity
    أضف مُنشئًا يستقبل الاسم والسعر والكمية (بهذا الترتيب) ويعيّن جميع القيم من خلال الخصائص لتطبيق التحقق من صحتها.
  • Program.cs: في ملفك الرئيسي، أنشئ Product باستخدام قيم الإدخال. ثم حاول تعديل السعر والكمية باستخدام قيم إدخال إضافية قد تكون غير صالحة. اطبع حالة المنتج بعد إنشائه وبعد كل تعديل لترى كيف تحمي الخصائص البيانات.

ستتلقى خمسة مدخلات:

  • اسم المنتج
  • السعر الأولي (عدد عشري)
  • الكمية الأولية (عدد صحيح)
  • السعر الجديد المراد تعيينه (عدد عشري، وقد يكون سالبًا)
  • الكمية الجديدة المراد تعيينها (عدد صحيح، وقد تكون خارج النطاق)

اطبع الناتج بهذا التنسيق:

After creation:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
After modifications:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}

على سبيل المثال، إذا كانت المدخلات هي Laptop و999.99 و50 و-100 و1500، فيجب أن يكون الناتج:

After creation:
Laptop: Price=999.99, Qty=50, Total=49999.50
After modifications:
Laptop: Price=0, Qty=1000, Total=0

لاحظ كيف أصبحت قيمة السعر السالب 0، وحُدّدت الكمية 1500 لتصبح 1000. تحمي خصائصك الكائن من الحالات غير الصالحة — وهذا هو مبدأ التغليف أثناء العمل!

جرّب بنفسك

using System;
using Inventory;

class Program
{
    public static void Main(string[] args)
    {
        // اقرأ المدخلات
        string name = Console.ReadLine();
        decimal initialPrice = Convert.ToDecimal(Console.ReadLine());
        int initialQuantity = Convert.ToInt32(Console.ReadLine());
        decimal newPrice = Convert.ToDecimal(Console.ReadLine());
        int newQuantity = Convert.ToInt32(Console.ReadLine());

        // TODO: أنشئ Product باستخدام القيم الأولية
        
        // TODO: اطبع حالة المنتج بعد إنشائه
        Console.WriteLine("After creation:");
        // تنسيق الطباعة: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
        
        // TODO: عدّل السعر والكمية باستخدام القيم الجديدة
        
        // TODO: اطبع حالة المنتج بعد التعديلات
        Console.WriteLine("After modifications:");
        // تنسيق الطباعة: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C# عبر الإنترنت