লুয়া একটি প্রোটোটাইপাল ভাষা, যার মানে হল যে এটি ক্লাস এবং অবজেক্ট ভিত্তিক OOP (Object-Oriented Programming) সরাসরি সমর্থন করে না, তবে Metatables ব্যবহার করে আপনি লুয়া ভাষায় অবজেক্ট-ওরিয়েন্টেড ডিজাইন (OOP) তৈরি করতে পারেন। Metatables লুয়া ভাষার একটি শক্তিশালী বৈশিষ্ট্য, যা আপনি অবজেক্ট তৈরি, ইনহেরিটেন্স, পলিমরফিজম এবং অন্যান্য OOP কনসেপ্ট সিমুলেট করতে ব্যবহার করতে পারেন।
এখানে আমরা Metatables ব্যবহার করে লুয়া ভাষায় একটি Object-Oriented Design কিভাবে তৈরি করা যায় তা বিস্তারিতভাবে আলোচনা করব।
১. Metatables এবং OOP
লুয়া ভাষায় metatables টেবিলগুলোর উপর অতিরিক্ত আচরণ সংজ্ঞায়িত করতে ব্যবহৃত হয়। যখন আপনি একটি টেবিলকে একটি metatable অ্যাসাইন করেন, তখন সেটি কিছু বিশেষ ফাংশনের মাধ্যমে পরিবর্তিত হয়, যেমন:
__index: টেবিলের একটি নতুন কিপেয়ে মান চাওয়ার জন্য।__newindex: টেবিলের নতুন কিপেয়ে মান সেট করার জন্য।__call: টেবিলকে ফাংশন হিসেবে কল করার জন্য।__tostring: টেবিলকে স্ট্রিং হিসেবে রূপান্তর করার জন্য।
এগুলোর মাধ্যমে, আপনি একটি class-like structure তৈরি করতে পারেন এবং ক্লাসের ফাংশনগুলি methods হিসেবে ব্যবহার করতে পারেন।
২. Metatables দিয়ে Object-Oriented Design তৈরি করা
লুয়া ভাষায় OOP বাস্তবায়ন করতে metatables ব্যবহার করে টেবিলগুলিকে ক্লাসের মতো আচরণ করানো যায়। এখানে আমরা একটি সাধারণ উদাহরণ দেখাবো, যেখানে একটি Person ক্লাস তৈরি করা হয়েছে এবং methods সহ ইনস্ট্যান্স তৈরি করা হয়েছে।
২.১. ক্লাস তৈরি এবং ইনস্ট্যান্স তৈরি করা
-- Person ক্লাস তৈরি
Person = {}
Person.__index = Person
-- Person এর constructor (new)
function Person.new(name, age)
local self = setmetatable({}, Person)
self.name = name
self.age = age
return self
end
-- Person এর একটি method (greet)
function Person:greet()
print("Hello, my name is " .. self.name .. " and I am " .. self.age .. " years old.")
end
-- ইনস্ট্যান্স তৈরি করা
local person1 = Person.new("Alice", 30)
local person2 = Person.new("Bob", 25)
person1:greet() -- আউটপুট: Hello, my name is Alice and I am 30 years old.
person2:greet() -- আউটপুট: Hello, my name is Bob and I am 25 years old.ব্যাখ্যা:
- Person টেবিলটি একটি ক্লাস হিসেবে কাজ করছে।
Person.newফাংশনটি একটি নতুন Person অবজেক্ট তৈরি করছে এবং এটি একটি metatable সেট করছে যাPersonক্লাসের বৈশিষ্ট্যগুলো প্রয়োগ করতে সাহায্য করে।Person:greetমেথডটি অবজেক্টের নাম এবং বয়স প্রিন্ট করার জন্য ব্যবহৃত হচ্ছে।- অবজেক্ট তৈরি করার সময়
setmetatable({}, Person)ব্যবহার করা হচ্ছে যাতে টেবিলের উপরPersonক্লাসের মেথডগুলি প্রযোজ্য হয়।
৩. Inheriting from another class
লুয়া ভাষায় Inheritance সিমুলেট করার জন্য Metatables ব্যবহার করা হয়। এখানে আমরা দেখাবো কিভাবে একটি Student ক্লাস Person ক্লাস থেকে ইনহেরিট করতে পারে।
৩.১. Inheritance উদাহরণ
-- Person ক্লাস
Person = {}
Person.__index = Person
function Person.new(name, age)
local self = setmetatable({}, Person)
self.name = name
self.age = age
return self
end
function Person:greet()
print("Hello, my name is " .. self.name .. " and I am " .. self.age .. " years old.")
end
-- Student ক্লাস (Person থেকে ইনহেরিট)
Student = setmetatable({}, Person) -- Student ক্লাস Person থেকে ইনহেরিট হচ্ছে
Student.__index = Student
function Student.new(name, age, school)
local self = Person.new(name, age) -- Person ক্লাসের constructor কল করা হচ্ছে
setmetatable(self, Student) -- Student ক্লাসের metatable সেট করা
self.school = school
return self
end
function Student:greet()
Person.greet(self) -- Person এর greet মেথড কল করা
print("I study at " .. self.school)
end
-- ইনস্ট্যান্স তৈরি করা
local student1 = Student.new("Charlie", 20, "XYZ University")
student1:greet()আউটপুট:
Hello, my name is Charlie and I am 20 years old.
I study at XYZ Universityব্যাখ্যা:
Studentক্লাসটিPersonক্লাস থেকে ইনহেরিট করছে। এটিPersonএর metatable ব্যবহার করছে, ফলেStudentটেবিলের ইনস্ট্যান্সPersonএর মেথডগুলোও ব্যবহার করতে পারছে।Student.newফাংশনে প্রথমেPerson.newফাংশনটি কল করা হয়েছে, তারপরStudentএর নিজস্ব ফিচারগুলো সেট করা হয়েছে।Student:greetমেথডেPerson.greet(self)কল করে প্রথমেPersonক্লাসের গ্রীট মেথডটি কল করা হয়েছে, তারপরStudentএর নিজস্ব ইনফরমেশন প্রিন্ট করা হয়েছে।
৪. Polymorphism in Lua (পলিমরফিজম)
লুয়া ভাষায় Polymorphism (পলিমরফিজম) বা একাধিক রূপ ধারণ করা অনেক সহজ। এটি সেই ধারণা যেখানে একাধিক ক্লাস বা অবজেক্ট একই নামের মেথডে ভিন্ন ভিন্ন আচরণ করতে পারে। একে সাধারণত মেথড ওভাররাইডিং বলা হয়।
উদাহরণ:
-- Person ক্লাস
Person = {}
Person.__index = Person
function Person.new(name)
local self = setmetatable({}, Person)
self.name = name
return self
end
function Person:speak()
print(self.name .. " is speaking!")
end
-- Student ক্লাস
Student = setmetatable({}, Person)
Student.__index = Student
function Student.new(name, school)
local self = Person.new(name)
setmetatable(self, Student)
self.school = school
return self
end
function Student:speak()
print(self.name .. " is studying at " .. self.school)
end
-- অবজেক্ট তৈরি করা
local person1 = Person.new("Alice")
local student1 = Student.new("Bob", "XYZ University")
-- polymorphism
person1:speak() -- আউটপুট: Alice is speaking!
student1:speak() -- আউটপুট: Bob is studying at XYZ Universityএখানে, Person এবং Student ক্লাসের speak মেথডে পলিমরফিজম প্রয়োগ করা হয়েছে। Student ক্লাসটি Person ক্লাসের speak মেথডটি ওভাররাইড করেছে।
সারসংক্ষেপ
- Metatables লুয়া ভাষায় Object-Oriented Design তৈরি করতে অত্যন্ত গুরুত্বপূর্ণ। এটি ক্লাস এবং অবজেক্ট সিমুলেট করতে সহায়তা করে।
- Coroutines বা ফাংশনালিজমের সাহায্যে কাস্টম methods তৈরি এবং ইনহেরিটেন্স ও পলিমরফিজম সিমুলেট করা সম্ভব।
- Metatables ব্যবহার করে লুয়া ভাষায় অবজেক্ট তৈরি, ইনহেরিটেন্স, এবং পলিমরফিজম সম্পাদন করা যায়, যা OOP এর মৌলিক কনসেপ্টগুলো কার্যকরভাবে প্রয়োগ করতে সাহায্য করে।
এই কৌশলগুলির মাধ্যমে, আপনি লুয়া ভাষায় আরও শক্তিশালী এবং পঠনযোগ্য কোড তৈরি করতে পারেন।
Read more