লুয়া ভাষায় Metatables ব্যবহার করে আপনি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণাগুলো ইমপ্লিমেন্ট করতে পারেন, যেমন ক্লাস, ইনহেরিটেন্স, পলিমরফিজম এবং ইনক্যাপসুলেশন। লুয়া একটি প্রোটোটাইপাল ভাষা, তাই এটি সরাসরি ক্লাস এবং অবজেক্ট সমর্থন করে না, তবে Metatables ব্যবহার করে আপনি এই ধারণাগুলো সিমুলেট করতে পারেন।
এখানে, Metatables এর মাধ্যমে একটি সাধারণ Object-Oriented Design তৈরি করার প্রক্রিয়া আলোচনা করা হবে।
১. OOP এর মূল ধারণা এবং Metatables
Metatables:
- Metatables হল বিশেষ টেবিল যা অন্য টেবিলের ওপর অতিরিক্ত আচরণ নির্ধারণ করে।
- আপনি মেটাটেবিলের মাধ্যমে একটি টেবিলকে ক্লাস হিসেবে ব্যবহার করতে পারেন, এবং সেখানে মেথড (functions) যুক্ত করতে পারেন।
OOP এর মূল কনসেপ্ট:
- ক্লাস (Class): একটি টেমপ্লেট বা ব্লুপ্রিন্ট যা অবজেক্ট তৈরি করতে ব্যবহৃত হয়।
- অবজেক্ট (Object): একটি কনক্রিট ইনস্ট্যান্স যা ক্লাসের মধ্যে সংজ্ঞায়িত বৈশিষ্ট্য এবং মেথড ধারণ করে।
- ইনহেরিটেন্স (Inheritance): একটি ক্লাস অন্য ক্লাসের বৈশিষ্ট্য এবং মেথড উত্তরাধিকারসূত্রে পায়।
- পলিমরফিজম (Polymorphism): একাধিক অবজেক্ট একই নামের মেথডের ভিন্ন ভিন্ন বাস্তবায়ন প্রদান করে।
- ইনক্যাপসুলেশন (Encapsulation): তথ্য এবং ফাংশনকে একটি অবজেক্টের মধ্যে আবদ্ধ করা।
২. ক্লাস এবং অবজেক্ট তৈরি করা
লুয়া ভাষায় Metatables ব্যবহার করে একটি ক্লাস তৈরি করা এবং তার ওপর মেথড প্রয়োগ করা হয়।
উদাহরণ:
-- Person ক্লাস তৈরি
Person = {}
Person.__index = Person
-- Person এর কনস্ট্রাকটর (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
-- Person ক্লাসের একটি ইনস্ট্যান্স তৈরি
local person1 = Person.new("Alice", 30)
person1:greet() -- আউটপুট: Hello, my name is Alice and I am 30 years old.এখানে, Person একটি ক্লাস হিসেবে কাজ করছে। Person.new ফাংশনটি নতুন অবজেক্ট তৈরি করে এবং Person:greet মেথডটি সেই অবজেক্টের মধ্যে থাকা তথ্য প্রিন্ট করে।
৩. Inheriting from Another Class (Inheritance)
লুয়া ভাষায় Inheritance সিমুলেট করতে, একটি ক্লাসের Metatable আরেকটি ক্লাসের Metatable হিসেবে সেট করা হয়। এই পদ্ধতিতে, একটি ক্লাস তার প্যারেন্ট ক্লাস থেকে বৈশিষ্ট্য এবং মেথড উত্তরাধিকারসূত্রে পায়।
উদাহরণ: 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("Bob", 22, "XYZ University")
student1:greet() -- আউটপুট: Hello, my name is Bob and I am 22 years old. I study at XYZ Universityব্যাখ্যা:
Studentক্লাসটিPersonক্লাস থেকে ইনহেরিট করেছে। এটিPersonএর মেথডgreetব্যবহার করছে, এবং তার পরStudentএর নিজস্বgreetমেথডটি প্রকাশ করছে, যেখানে স্কুলের নামও যুক্ত করা হয়েছে।
৪. Polymorphism (পলিমরফিজম)
লুয়া ভাষায় Polymorphism সিমুলেট করার জন্য, আপনি একাধিক ক্লাসে একই নামের মেথড ব্যবহার করতে পারেন, তবে তাদের আচরণ ভিন্ন হবে।
উদাহরণ: 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 ক্লাস (Person থেকে ইনহেরিট)
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")
person1:speak() -- আউটপুট: Alice is speaking.
student1:speak() -- আউটপুট: Bob is studying at XYZ Universityএখানে, speak মেথডটি Person এবং Student ক্লাসে দুইটি ভিন্নভাবে কার্যকর হচ্ছে, যা পলিমরফিজমের উদাহরণ।
৫. Encapsulation (ইনক্যাপসুলেশন)
Encapsulation হল অবজেক্টের ডেটা এবং ফাংশনকে একসাথে আবদ্ধ করা। এটি সাধারনত private এবং public প্রপার্টি এবং মেথডস ব্যবহার করে সিমুলেট করা হয়। লুয়া ভাষায়, আপনি local ব্যবহার করে কিছু ফাংশন বা ভ্যারিয়েবলকে private করতে পারেন, যাতে বাইরে থেকে অ্যাক্সেস করা না যায়।
উদাহরণ: Encapsulation
-- Person ক্লাস
Person = {}
Person.__index = Person
function Person.new(name, age)
local self = setmetatable({}, Person)
self.name = name
self.age = age
return self
end
-- Private method
local function privateMethod(self)
print(self.name .. " has a private method.")
end
-- Public method
function Person:publicMethod()
print(self.name .. " has a public method.")
privateMethod(self) -- public method থেকে private method কল করা
end
local person1 = Person.new("Alice", 30)
person1:publicMethod() -- আউটপুট: Alice has a public method. Alice has a private method.এখানে, privateMethod শুধুমাত্র Person ক্লাসের ভেতরে অ্যাক্সেসযোগ্য, এবং এটি publicMethod এর মাধ্যমে কল করা হচ্ছে। এইভাবে ইনক্যাপসুলেশন সিমুলেট করা হয়েছে।
সারসংক্ষেপ
- Metatables ব্যবহার করে লুয়া ভাষায় OOP ধারণাগুলো সিমুলেট করা যায়, যেমন ক্লাস, ইনহেরিটেন্স, পলিমরফিজম, এবং ইনক্যাপসুলেশন।
- Metatables টেবিলগুলির মধ্যে অতিরিক্ত আচরণ সংজ্ঞায়িত করতে ব্যবহৃত হয়, যা অবজেক্ট-ওরিয়েন্টেড ডিজাইনের ভিত্তি হিসেবে কাজ করে।
- Inheritance, Polymorphism, এবং Encapsulation কাস্টম ডেটা টাইপ এবং মেথডস ব্যবহার করে OOP বাস্তবায়ন করা সম্ভব।