Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

نسخ مستقلة

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

من الجوانب الأساسية في البرمجة كائنية التوجه أن كل instance يحافظ على حالته separate الخاصة به. عند إنشاء كائنين من الفئة نفسها، فإنهما مستقلان تمامًا: تغيير أحدهما لا يؤثر في الآخر.

تأمل هذا المثال:

local Counter = {}
Counter.__index = Counter

function Counter:new(start)
    local instance = {}
    setmetatable(instance, self)
    instance.value = start or 0
    return instance
end

function Counter:increment()
    self.value = self.value + 1
end

-- إنشاء عدّادين منفصلين
local counterA = Counter:new(10)
local counterB = Counter:new(5)

counterA:increment()
counterA:increment()

print(counterA.value)  -- المخرجات: 12
print(counterB.value)  -- المخرجات: 5

على الرغم من أن كلا العدادين يأتيان من الفئة Counter نفسها، فإن زيادة counterA لا تؤثر في counterB. لكل كائن حقل value خاص به مخزّن في جدول المثيل الخاص به.

هذا الاستقلال هو ما يجعل الكائنات مفيدة. يمكنك إنشاء عشرات اللاعبين في لعبة، بحيث يتتبّع كل منهم صحته ونتيجته الخاصة. يمكنك إدارة حسابات بنكية متعددة، لكل منها رصيد مختلف.

يحدّد الصنف البنية والسلوك، لكن كل مثيل يعيش حياته الخاصة ببياناته الخاصة.

challenge icon

التحدي

سهل

لنثبت أن الكائنات من الفئة نفسها تعيش حقًا حياة مستقلة! ستبني فئة Wallet وتنشئ مثيلين منفصلين من المحافظ، ثم تعدّلهما بشكل مستقل لإثبات أن التغييرات التي تطرأ على إحداهما لا تؤثر في الأخرى.

ستنظّم شيفرتك عبر ملفين:

  • Wallet.lua: عرّف فئة Wallet باستخدام نمط المُنشئ القياسي. يجب أن تتعقب كل محفظة balance الخاصة بها. أدرج:
    • مُنشئ :new(startingBalance) يهيّئ المحفظة بالمبلغ المُعطى
    • طريقة :add(amount) تزيد الرصيد
    • طريقة :spend(amount) تقلّل الرصيد
  • main.lua: اطلب وحدة Wallet وأنشئ مثيلين منفصلين من المحافظ. نفّذ عمليات مختلفة على كل منهما لإظهار أنهما يحافظان على حالة مستقلة.

ستتلقى أربعة مدخلات:

  1. الرصيد الابتدائي للمحفظة A
  2. الرصيد الابتدائي للمحفظة B
  3. المبلغ المراد إضافته إلى المحفظة A
  4. المبلغ المراد إنفاقه من المحفظة B

في ملفك الرئيسي:

  1. أنشئ walletA باستخدام الرصيد الابتدائي الأول
  2. أنشئ walletB باستخدام الرصيد الابتدائي الثاني
  3. أضف المبلغ المحدد إلى walletA
  4. أنفق المبلغ المحدد من walletB
  5. اطبع الرصيدين في سطرين منفصلين

اطبع الرصيدين النهائيين بهذا التنسيق الدقيق:

Wallet A: [balance]
Wallet B: [balance]

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

Wallet A: 125
Wallet B: 40

لاحظ كيف أن الإضافة إلى المحفظة A لا تغيّر المحفظة B، وأن الإنفاق من المحفظة B لا يؤثر في المحفظة A: إذ يحافظ كل مثيل على رصيده المنفصل الخاص به.

جرّب بنفسك

-- تتطلب وحدة Wallet
local Wallet = require('Wallet')

-- قراءة المدخلات
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())

-- TODO: أنشئ walletA بالرصيد الابتدائي الأول

-- TODO: أنشئ walletB بالرصيد الابتدائي الثاني

-- TODO: أضف المبلغ المحدد إلى walletA

-- TODO: أنفق المبلغ المحدد من walletB

-- TODO: اطبع الأرصدة النهائية بالتنسيق المطلوب
-- التنسيق: "Wallet A: [balance]" و "Wallet B: [balance]"
quiz iconاختبر نفسك

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

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

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