Swift-এ অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP)
অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP) হলো প্রোগ্রামিং-এর একটি প্যারাডাইম, যা কোড সংগঠিত এবং পুনঃব্যবহারযোগ্য করতে অবজেক্ট এবং ক্লাস ব্যবহার করে। Swift OOP সমর্থন করে এবং এতে ক্লাস, অবজেক্ট, ইনহেরিটেন্স, পলিমরফিজম, এনক্যাপসুলেশন, এবং অ্যাবস্ট্রাকশন-এর মতো গুরুত্বপূর্ণ বৈশিষ্ট্য রয়েছে। নিচে Swift-এ OOP-এর বিভিন্ন ধারণা নিয়ে আলোচনা করা হলো:
১. ক্লাস (Class) এবং অবজেক্ট (Object)
ক্লাস হলো একটি টেমপ্লেট যা প্রপার্টি (ডেটা) এবং মেথড (ফাংশন) সংজ্ঞায়িত করে। অবজেক্ট হলো একটি ক্লাসের ইনস্ট্যান্স। ক্লাসের সাহায্যে আপনি কোডকে পুনঃব্যবহারযোগ্য, সংগঠিত, এবং মডুলার করতে পারেন।
ক্লাস ডিক্লেয়ারেশন এবং অবজেক্ট তৈরি:
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func greet() {
print("Hello, my name is \(name) and I am \(age) years old.")
}
}
let person1 = Person(name: "Alice", age: 25)
person1.greet() // আউটপুট: "Hello, my name is Alice and I am 25 years old."
২. ইনহেরিটেন্স (Inheritance)
Swift-এ এক ক্লাস অন্য ক্লাস থেকে বৈশিষ্ট্য (প্রপার্টি এবং মেথড) উত্তরাধিকার সূত্রে পেতে পারে। ইনহেরিটেন্স কোড পুনঃব্যবহারযোগ্য করে তোলে এবং সম্পর্কযুক্ত ক্লাসগুলির মধ্যে সাধারণ বৈশিষ্ট্য ভাগ করে।
class Employee: Person {
var jobTitle: String
init(name: String, age: Int, jobTitle: String) {
self.jobTitle = jobTitle
super.init(name: name, age: age)
}
override func greet() {
print("Hello, I am \(name), working as a \(jobTitle).")
}
}
let employee = Employee(name: "Bob", age: 30, jobTitle: "Engineer")
employee.greet() // আউটপুট: "Hello, I am Bob, working as an Engineer."
overrideকীওয়ার্ড ব্যবহার করে সাবক্লাস প্যারেন্ট ক্লাসের মেথডকে ওভাররাইড করতে পারে।
৩. এনক্যাপসুলেশন (Encapsulation)
এনক্যাপসুলেশন হলো ডেটা এবং মেথডকে একটি ক্লাসের ভিতরে আবদ্ধ করা এবং বাইরের অ্যাক্সেস নিয়ন্ত্রণ করা। এতে কোডের নিরাপত্তা ও ডেটা ম্যানেজমেন্ট সহজ হয়। Swift-এ প্রপার্টি এবং মেথডের অ্যাক্সেস কন্ট্রোলার নির্ধারণ করে এনক্যাপসুলেশন করা যায়।
class BankAccount {
private var balance: Double = 0.0
func deposit(amount: Double) {
balance += amount
}
func withdraw(amount: Double) -> Bool {
if amount <= balance {
balance -= amount
return true
} else {
return false
}
}
func getBalance() -> Double {
return balance
}
}
let account = BankAccount()
account.deposit(amount: 500)
print(account.getBalance()) // আউটপুট: 500.0
privateঅ্যাক্সেস মোডিফায়ার ব্যবহার করে প্রপার্টিকে বাইরের অ্যাক্সেস থেকে সুরক্ষিত করা হয়।
৪. পলিমরফিজম (Polymorphism)
পলিমরফিজম হলো একাধিক ক্লাসে একই মেথড বা প্রপার্টির বিভিন্ন রূপ প্রদান করা। এটি ইনহেরিটেন্সের মাধ্যমে প্রয়োগ করা যায়। Swift-এ এটি ওভাররাইড মেথড এবং প্রোটোকল ব্যবহার করে করা যায়।
class Animal {
func sound() {
print("Some generic animal sound")
}
}
class Dog: Animal {
override func sound() {
print("Bark")
}
}
class Cat: Animal {
override func sound() {
print("Meow")
}
}
let animals: [Animal] = [Dog(), Cat()]
for animal in animals {
animal.sound()
}
// আউটপুট: "Bark"
// আউটপুট: "Meow"
৫. প্রোটোকল (Protocol)
Swift-এ প্রোটোকল হলো একটি টেমপ্লেট বা ব্লুপ্রিন্ট যা মেথড এবং প্রপার্টির ধারণা দেয়। এটি জাভা বা সি#-এর ইন্টারফেসের মতো। প্রোটোকল ব্যবহার করে ক্লাস বা স্ট্রাকচারে মেথড এবং প্রপার্টি ইমপ্লিমেন্টেশন নির্ধারণ করা যায়।
protocol Drivable {
func drive()
}
class Car: Drivable {
func drive() {
print("Driving the car")
}
}
let myCar = Car()
myCar.drive() // আউটপুট: "Driving the car"
সংক্ষেপে:
Swift-এ OOP এর মূল ধারণাগুলি হলো:
- ক্লাস এবং অবজেক্ট: ডেটা এবং ফাংশনালিটি সংগঠিত ও পুনঃব্যবহারযোগ্য করতে।
- ইনহেরিটেন্স: কোড পুনঃব্যবহার এবং সম্পর্কিত ক্লাসগুলির সাধারণ বৈশিষ্ট্য ভাগ করতে।
- এনক্যাপসুলেশন: ডেটা এবং ফাংশনকে সুরক্ষিত রাখতে।
- পলিমরফিজম: বিভিন্ন ক্লাসে একই মেথড বা প্রপার্টির বিভিন্ন রূপ।
- প্রোটোকল: মেথড এবং প্রপার্টির জন্য ব্লুপ্রিন্ট নির্ধারণ করতে।
OOP ব্যবহার করে Swift প্রোগ্রামিং সহজ, পুনঃব্যবহারযোগ্য এবং সুগঠিত করা যায়।
Swift-এ ক্লাস এবং অবজেক্ট হলো অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর মূল ধারণা। ক্লাস হলো একটি টেমপ্লেট বা ব্লুপ্রিন্ট, যার মাধ্যমে আমরা অবজেক্ট তৈরি করি। অবজেক্ট হলো সেই টেমপ্লেট থেকে তৈরি করা ইনস্ট্যান্স, যা ক্লাসের প্রোপার্টি এবং মেথড ব্যবহার করতে পারে। Swift-এ ক্লাস এবং অবজেক্ট ব্যবহার করে প্রোগ্রামকে আরও মডিউলার, পুনঃব্যবহারযোগ্য, এবং সুসংগতভাবে গঠন করা যায়।
১. ক্লাস কী?
ক্লাস হলো একটি ডেটা স্ট্রাকচার, যা ভেরিয়েবল এবং ফাংশনের সমন্বয়ে তৈরি হয়। ক্লাসের ভিতরে আমরা প্রোপার্টি এবং মেথড ডিফাইন করি, যা অবজেক্টের বৈশিষ্ট্য এবং কার্যক্রম নির্ধারণ করে।
ক্লাসের গঠন
class ClassName {
// প্রোপার্টি
var property1: Type
var property2: Type
// ইনিশিয়ালাইজার (Initializer)
init(property1: Type, property2: Type) {
self.property1 = property1
self.property2 = property2
}
// মেথড
func methodName() {
// কার্যক্রম
}
}
class: ক্লাস ডিফাইন করার জন্য ব্যবহার করা হয়।- প্রোপার্টি: ক্লাসের বৈশিষ্ট্য, যা সাধারণত ভেরিয়েবল বা কনস্ট্যান্ট হিসেবে থাকে।
- মেথড: ক্লাসের কার্যক্রম, যা ফাংশন আকারে ডিফাইন করা হয়।
- ইনিশিয়ালাইজার (
init): ক্লাসের প্রোপার্টি ইনিশিয়ালাইজ করার জন্য ব্যবহৃত হয়।
২. একটি ক্লাস উদাহরণ
class Person {
var name: String
var age: Int
// ইনিশিয়ালাইজার
init(name: String, age: Int) {
self.name = name
self.age = age
}
// মেথড
func greet() {
print("Hello, my name is \(name) and I am \(age) years old.")
}
}
- এখানে,
Personক্লাসটি দুটি প্রোপার্টি (nameএবংage) এবং একটি মেথড (greet()) নিয়ে গঠিত। - ইনিশিয়ালাইজারটি ব্যবহার করে আমরা ক্লাসের প্রোপার্টি ইনিশিয়ালাইজ করতে পারি।
৩. অবজেক্ট কী?
অবজেক্ট হলো ক্লাসের একটি ইনস্ট্যান্স, যা ক্লাসের প্রোপার্টি এবং মেথড ব্যবহার করে। ক্লাস থেকে অবজেক্ট তৈরি করতে, আমরা ক্লাসের নাম এবং ইনিশিয়ালাইজার ব্যবহার করে একটি ইনস্ট্যান্স তৈরি করি।
অবজেক্ট তৈরি করা
let person1 = Person(name: "Alice", age: 25)
let person2 = Person(name: "Bob", age: 30)
// অবজেক্টের প্রোপার্টি অ্যাক্সেস করা
print(person1.name) // Output: Alice
print(person2.age) // Output: 30
// অবজেক্টের মেথড কল করা
person1.greet() // Output: Hello, my name is Alice and I am 25 years old.
person2.greet() // Output: Hello, my name is Bob and I am 30 years old.
person1এবংperson2হলোPersonক্লাস থেকে তৈরি করা দুটি অবজেক্ট।- অবজেক্টের প্রোপার্টি এবং মেথড অ্যাক্সেস করে আমরা তাদের উপর নির্দিষ্ট কার্যক্রম পরিচালনা করতে পারি।
৪. ক্লাসের প্রোপার্টির ডিফল্ট মান এবং কনস্ট্যান্ট
ক্লাসের প্রোপার্টিতে ডিফল্ট মান দেওয়া যেতে পারে এবং চাইলে let ব্যবহার করে কনস্ট্যান্টও ডিফাইন করা যায়।
class Car {
var brand: String = "Unknown"
var model: String
let wheels: Int = 4
init(model: String) {
self.model = model
}
}
let myCar = Car(model: "Model S")
print(myCar.brand) // Output: Unknown
print(myCar.wheels) // Output: 4
- এখানে,
brandপ্রোপার্টির ডিফল্ট মান"Unknown"এবংwheelsকনস্ট্যান্ট মান হিসেবে4ডিফাইন করা হয়েছে।
৫. মেথডে প্যারামিটার এবং রিটার্ন টাইপ
ক্লাসের মেথডগুলোতে প্যারামিটার এবং রিটার্ন টাইপ ব্যবহার করা যায়।
class Calculator {
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
func multiply(_ a: Int, _ b: Int) -> Int {
return a * b
}
}
let calc = Calculator()
let sum = calc.add(5, 3) // Output: 8
let product = calc.multiply(4, 6) // Output: 24
- এখানে,
addএবংmultiplyনামের মেথড দুটি ইন্টিজার প্যারামিটার গ্রহণ করে এবং তাদের যোগফল ও গুণফল রিটার্ন করে।
৬. ইনহেরিটেন্স (Inheritance)
Swift-এ একটি ক্লাস অন্য একটি ক্লাস থেকে প্রোপার্টি এবং মেথড উত্তরাধিকারী হতে পারে। এটি ক্লাসের কার্যকারিতা বাড়াতে সাহায্য করে।
class Vehicle {
var brand: String
init(brand: String) {
self.brand = brand
}
func start() {
print("\(brand) is starting.")
}
}
// Car ক্লাস Vehicle ক্লাস থেকে ইনহেরিট করছে
class Car: Vehicle {
var model: String
init(brand: String, model: String) {
self.model = model
super.init(brand: brand)
}
override func start() {
print("\(brand) \(model) is starting.")
}
}
let myCar = Car(brand: "Tesla", model: "Model 3")
myCar.start() // Output: "Tesla Model 3 is starting."
- এখানে
Carক্লাসটিVehicleক্লাস থেকে ইনহেরিট করেছে এবং এর মেথডstart()ওভাররাইড করা হয়েছে।
৭. ক্লাস বনাম স্ট্রাকচার (Class vs. Struct)
Swift-এ ক্লাস এবং স্ট্রাকচারের মধ্যে কিছু পার্থক্য রয়েছে:
- রেফারেন্স টাইপ: ক্লাস হলো রেফারেন্স টাইপ, অর্থাৎ ক্লাসের অবজেক্ট একাধিক ভেরিয়েবলে রেফারেন্স হিসেবে পাস করা হয়।
- ইনহেরিটেন্স: স্ট্রাকচার ইনহেরিট করতে পারে না, কিন্তু ক্লাস করতে পারে।
- ডি-ইনিশিয়ালাইজার: ক্লাসে ডি-ইনিশিয়ালাইজার থাকে, যা অবজেক্ট মেমোরি থেকে সরানোর আগে এক্সিকিউট হয়।
উপসংহার
Swift-এ ক্লাস এবং অবজেক্ট OOP (অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং)-এর গুরুত্বপূর্ণ অংশ, যা প্রোগ্রামকে আরও মডিউলার, পুনঃব্যবহারযোগ্য, এবং সুসংগতভাবে গঠন করতে সহায়ক।
- ক্লাস হলো একটি টেমপ্লেট, যা প্রোপার্টি এবং মেথড ধারণ করে।
- অবজেক্ট হলো ক্লাস থেকে তৈরি করা ইনস্ট্যান্স, যা সেই প্রোপার্টি এবং মেথড ব্যবহার করতে পারে।
Swift-এ ক্লাস ব্যবহার করে আমরা বড় প্রোগ্রাম সহজভাবে ডিজাইন এবং পরিচালনা করতে পারি।
Swift-এ প্রোপার্টিজ এবং মেথড
Swift-এ প্রোপার্টিজ এবং মেথড ব্যবহার করে আপনি ক্লাস (class), স্ট্রাক্ট (struct), এবং এনাম (enum) তৈরি করতে পারেন, যা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ অংশ। প্রোপার্টিজ হলো অবজেক্টের গুণাবলী (attributes) বা মান (values), আর মেথড হলো ফাংশন যা এই প্রোপার্টিজের উপর কাজ করে বা কিছু নির্দিষ্ট কার্যকলাপ সম্পাদন করে।
প্রোপার্টিজ (Properties)
Swift-এ প্রোপার্টিজ মূলত দুটি ভাগে ভাগ করা যায়:
- স্টোরড প্রোপার্টিজ (Stored Properties): এগুলো হলো ভেরিয়েবল বা কনস্ট্যান্ট, যা ডেটা স্টোর করে রাখে।
- কম্পিউটেড প্রোপার্টিজ (Computed Properties): এগুলো সরাসরি ডেটা স্টোর না করে, বরং গণনা করে একটি মান প্রদান করে।
স্টোরড প্রোপার্টিজ (Stored Properties)
স্টোরড প্রোপার্টিজ হলো ভেরিয়েবল বা কনস্ট্যান্ট যা ক্লাস বা স্ট্রাক্টের মধ্যে সরাসরি মান সংরক্ষণ করে।
উদাহরণ:
struct Car {
var brand: String
var model: String
var year: Int
}
var myCar = Car(brand: "Toyota", model: "Corolla", year: 2020)
print("Brand: \(myCar.brand), Model: \(myCar.model), Year: \(myCar.year)")
এখানে, Car স্ট্রাক্টের মধ্যে তিনটি স্টোরড প্রোপার্টিজ আছে—brand, model, এবং year। আমরা এই প্রোপার্টিজগুলো ব্যবহার করে myCar অবজেক্ট তৈরি করেছি এবং তাদের মান প্রিন্ট করেছি।
কম্পিউটেড প্রোপার্টিজ (Computed Properties)
কম্পিউটেড প্রোপার্টিজ সরাসরি মান সংরক্ষণ করে না; বরং, একটি ক্যালকুলেশন বা এক্সপ্রেশন ব্যবহার করে একটি মান প্রদান করে। এটি সাধারণত get এবং set ব্লক ব্যবহার করে ডিফাইন করা হয়।
উদাহরণ:
struct Rectangle {
var width: Double
var height: Double
var area: Double {
return width * height
}
}
let rect = Rectangle(width: 5.0, height: 10.0)
print("Area: \(rect.area)")
এখানে, Rectangle স্ট্রাক্টের মধ্যে area নামে একটি কম্পিউটেড প্রোপার্টি আছে, যা width এবং height এর মান ব্যবহার করে এর ক্ষেত্রফল (area) গণনা করে।
প্রপার্টি অবজারভার (Property Observers)
Swift-এ প্রোপার্টি অবজারভার ব্যবহার করে স্টোরড প্রোপার্টিজের মান পরিবর্তন হওয়ার সময় কিছু কার্যকলাপ সম্পাদন করা যায়। এটি willSet এবং didSet ব্লক ব্যবহার করে ডিফাইন করা হয়।
struct StepCounter {
var steps: Int = 0 {
willSet(newSteps) {
print("About to set steps to \(newSteps)")
}
didSet {
print("Added \(steps - oldValue) steps")
}
}
}
var counter = StepCounter()
counter.steps = 100
counter.steps = 150
এখানে, steps প্রোপার্টিতে নতুন মান সেট করার আগে এবং পরে মেসেজ প্রিন্ট করা হবে।
মেথড (Methods)
Swift-এ মেথড হলো ফাংশন, যা ক্লাস, স্ট্রাক্ট, বা এনাম-এর সাথে যুক্ত। মেথড ক্লাস বা অবজেক্টের প্রোপার্টিজের উপর কাজ করে এবং নির্দিষ্ট কার্যকলাপ সম্পাদন করে।
ইনস্ট্যান্স মেথড (Instance Methods)
ইনস্ট্যান্স মেথড হলো মেথড যা একটি ক্লাস বা স্ট্রাক্টের নির্দিষ্ট ইনস্ট্যান্সের উপর কাজ করে।
উদাহরণ:
class Person {
var name: String
init(name: String) {
self.name = name
}
func greet() -> String {
return "Hello, my name is \(name)."
}
}
let person = Person(name: "Alice")
print(person.greet())
এখানে, Person ক্লাসের মধ্যে greet নামে একটি ইনস্ট্যান্স মেথড আছে, যা name প্রোপার্টির উপর ভিত্তি করে একটি মেসেজ রিটার্ন করে।
টাইপ মেথড (Type Methods)
টাইপ মেথড ক্লাস বা স্ট্রাক্টের জন্য সাধারণভাবে ব্যবহৃত হয়, যা নির্দিষ্ট ইনস্ট্যান্সের উপর কাজ না করে পুরো ক্লাস বা স্ট্রাক্টের উপর কাজ করে। টাইপ মেথড ডিফাইন করতে static বা class কীওয়ার্ড ব্যবহার করা হয়।
উদাহরণ:
struct Math {
static func square(_ number: Int) -> Int {
return number * number
}
}
print(Math.square(4))
এখানে, Math স্ট্রাক্টের square নামে একটি টাইপ মেথড আছে, যা একটি সংখ্যা গ্রহণ করে এবং তার বর্গফল রিটার্ন করে।
উপসংহার
Swift-এ প্রোপার্টিজ এবং মেথড ব্যবহার করে আপনি ক্লাস, স্ট্রাক্ট, এবং এনাম তৈরি করতে পারেন, যা আপনার কোডকে আরও সংগঠিত এবং মডুলার করে।
- প্রোপার্টিজ: একটি অবজেক্টের গুণাবলী বা মান সংরক্ষণ করে। এটি স্টোরড বা কম্পিউটেড হতে পারে।
- মেথড: ফাংশন, যা অবজেক্টের প্রোপার্টিজের উপর কাজ করে এবং কিছু কার্যকলাপ সম্পাদন করে। এটি ইনস্ট্যান্স বা টাইপ মেথড হতে পারে।
প্রোপার্টিজ এবং মেথড Swift প্রোগ্রামিং-এর একটি গুরুত্বপূর্ণ অংশ, যা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণাকে শক্তিশালী করে এবং কোডকে আরও রিডেবল এবং পুনরায় ব্যবহারযোগ্য করে তোলে।
Swift-এ অ্যাক্সেস কন্ট্রোল: private, public, internal
Swift-এ অ্যাক্সেস কন্ট্রোল ক্লাস, স্ট্রাকচার, প্রপার্টি, এবং মেথডের অ্যাক্সেস সীমিত বা অনুমোদিত করতে ব্যবহৃত হয়। Swift-এ প্রধানত পাঁচটি অ্যাক্সেস কন্ট্রোল লেভেল রয়েছে, তবে আমরা এখানে private, public, এবং internal নিয়ে আলোচনা করব।
১. private
- সীমাবদ্ধতা: কেবল একই সোর্স ফাইল বা একই ক্লাস বা স্ট্রাকচারের মধ্যে অ্যাক্সেসযোগ্য।
- ব্যবহার: ডেটা এবং মেথড সুরক্ষিত রাখতে।
class Car {
private var engineStatus = "Off"
private func startEngine() {
engineStatus = "On"
}
}
২. public
- সীমাবদ্ধতা: যেকোনো সোর্স ফাইল বা মডিউল থেকে অ্যাক্সেসযোগ্য।
- ব্যবহার: বাইরের কোডের জন্য উন্মুক্ত করতে।
public class Vehicle {
public var type = "Car"
public func drive() {
print("Driving the vehicle")
}
}
৩. internal (ডিফল্ট অ্যাক্সেস কন্ট্রোল)
- সীমাবদ্ধতা: একই মডিউলের মধ্যে অ্যাক্সেসযোগ্য, তবে বাইরের মডিউল থেকে নয়।
- ব্যবহার: একই অ্যাপ্লিকেশনের বিভিন্ন অংশে ব্যবহার করতে।
internal class Bike {
internal var speed = 50
internal func ride() {
print("Riding the bike")
}
}
সংক্ষেপে
- private: কেবল একই ক্লাস বা সোর্স ফাইলে সীমাবদ্ধ।
- public: যেকোনো মডিউল বা সোর্স ফাইল থেকে অ্যাক্সেসযোগ্য।
- internal: একই মডিউলের মধ্যে সীমাবদ্ধ (ডিফল্ট)।
এই কন্ট্রোল লেভেলগুলো ব্যবহার করে আপনি কোডকে সুরক্ষিত, কার্যকরী এবং সুগঠিত রাখতে পারেন।
Swift-এ ইনহেরিটেন্স এবং পলিমরফিজম হলো অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর দুটি গুরুত্বপূর্ণ ধারণা। ইনহেরিটেন্সের মাধ্যমে আমরা একটি ক্লাস থেকে আরেকটি ক্লাস তৈরি করতে পারি এবং পলিমরফিজমের মাধ্যমে একই মেথড বিভিন্ন রূপে ব্যবহার করতে পারি। এগুলির মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা, মডুলারিটি, এবং স্থায়িত্ব বৃদ্ধি পায়।
ইনহেরিটেন্স (Inheritance)
ইনহেরিটেন্স হলো একটি প্রক্রিয়া, যার মাধ্যমে একটি ক্লাস অন্য একটি ক্লাস থেকে প্রোপার্টি এবং মেথড উত্তরাধিকারী হয়। ইনহেরিটেন্স ব্যবহার করে নতুন ক্লাস তৈরি করা যায়, যা পূর্ববর্তী ক্লাসের সব বৈশিষ্ট্য ও কার্যকারিতা উত্তরাধিকারী করে এবং প্রয়োজনে নতুন প্রোপার্টি ও মেথড যুক্ত করতে পারে।
উদাহরণ: ইনহেরিটেন্স ব্যবহার করে ক্লাস তৈরি করা
// Parent ক্লাস
class Animal {
var name: String
init(name: String) {
self.name = name
}
func sound() {
print("\(name) makes a sound.")
}
}
// Child ক্লাস, যা Animal ক্লাস থেকে ইনহেরিট করছে
class Dog: Animal {
func bark() {
print("\(name) barks.")
}
}
let myDog = Dog(name: "Buddy")
myDog.sound() // Output: "Buddy makes a sound."
myDog.bark() // Output: "Buddy barks."
- এখানে,
Animalহলো একটি প্যারেন্ট (বা বেস) ক্লাস, এবংDogহলো একটি চাইল্ড (বা ডেরাইভড) ক্লাস, যাAnimalক্লাস থেকে ইনহেরিট করছে। Dogক্লাসটিAnimalক্লাসের প্রোপার্টি (name) এবং মেথড (sound()) অ্যাক্সেস করতে পারে এবং নিজের নতুন মেথড (bark()) যোগ করতে পারে।
মেথড ওভাররাইডিং (Method Overriding)
Swift-এ, চাইল্ড ক্লাসে ইনহেরিট করা মেথডকে ওভাররাইড করা যায়, অর্থাৎ চাইল্ড ক্লাস সেই মেথডের নিজের সংস্করণ তৈরি করতে পারে। এটি পলিমরফিজমের একটি গুরুত্বপূর্ণ অংশ।
class Animal {
var name: String
init(name: String) {
self.name = name
}
func sound() {
print("\(name) makes a sound.")
}
}
class Cat: Animal {
override func sound() {
print("\(name) meows.")
}
}
let myCat = Cat(name: "Whiskers")
myCat.sound() // Output: "Whiskers meows."
- এখানে,
Catক্লাসটিAnimalক্লাস থেকে ইনহেরিট করেছে এবংsound()মেথড ওভাররাইড করেছে। ফলেCatক্লাসের ইনস্ট্যান্সsound()কল করলে নতুনভাবে ডিফাইন করা মেথড এক্সিকিউট হবে।
পলিমরফিজম (Polymorphism)
পলিমরফিজম হলো OOP-এর একটি ধারণা, যেখানে একটি মেথড বা ফাংশন বিভিন্ন ক্লাসে বিভিন্নভাবে আচরণ করতে পারে। অর্থাৎ, একই নামের মেথড বা প্রোপার্টি বিভিন্ন ক্লাসে বিভিন্নভাবে ব্যবহৃত হতে পারে। পলিমরফিজম সাধারণত ইনহেরিটেন্সের মাধ্যমে অর্জিত হয় এবং এটি কোডকে আরও ফ্লেক্সিবল এবং পুনঃব্যবহারযোগ্য করে তোলে।
উদাহরণ: পলিমরফিজম ব্যবহার করে
class Animal {
var name: String
init(name: String) {
self.name = name
}
func sound() {
print("\(name) makes a sound.")
}
}
class Dog: Animal {
override func sound() {
print("\(name) barks.")
}
}
class Cat: Animal {
override func sound() {
print("\(name) meows.")
}
}
let animals: [Animal] = [Dog(name: "Buddy"), Cat(name: "Whiskers")]
for animal in animals {
animal.sound()
}
- এখানে,
animalsহলোAnimalক্লাসের ইনস্ট্যান্সের একটি অ্যারে, যেখানেDogএবংCatক্লাসের অবজেক্ট রয়েছে। - লুপের ভিতরে
sound()মেথড কল করা হলে, প্রতিটি অবজেক্ট তার নিজস্ব ওভাররাইড করা মেথড এক্সিকিউট করে:
Buddy barks.
Whiskers meows.
এই উদাহরণে, একই নামের মেথড (sound()) বিভিন্ন ক্লাসে ভিন্নভাবে আচরণ করছে, যা পলিমরফিজমের একটি উদাহরণ।
ফাইনাল ক্লাস এবং মেথড
Swift-এ আপনি কোনো ক্লাস বা মেথডকে final হিসেবে ডিফাইন করতে পারেন, যাতে সেগুলো ইনহেরিট বা ওভাররাইড করা না যায়।
final class Bird {
var species: String
init(species: String) {
self.species = species
}
}
// এই ক্লাসটি আর ইনহেরিট করা যাবে না।
Birdক্লাসটিকেfinalহিসেবে ডিফাইন করা হয়েছে, তাই এটি আর অন্য কোনো ক্লাস থেকে ইনহেরিট করা যাবে না।
সংক্ষেপে ইনহেরিটেন্স এবং পলিমরফিজম
| বৈশিষ্ট্য | ইনহেরিটেন্স | পলিমরফিজম |
|---|---|---|
| বিবরণ | একটি ক্লাস আরেকটি ক্লাস থেকে প্রোপার্টি এবং মেথড ইনহেরিট করে। | একই নামের মেথড বা প্রোপার্টি ভিন্নভাবে ব্যবহৃত হতে পারে। |
| উদাহরণ | Dog ক্লাসটি Animal ক্লাস থেকে ইনহেরিট করে। | sound() মেথডটি Dog এবং Cat ক্লাসে ভিন্নভাবে ডিফাইন করা হয়েছে। |
উপসংহার
Swift-এ ইনহেরিটেন্স এবং পলিমরফিজম প্রোগ্রামের কোডকে আরও মডিউলার, পুনঃব্যবহারযোগ্য, এবং ফ্লেক্সিবল করে তোলে।
- ইনহেরিটেন্স: নতুন ক্লাস তৈরি করার সময় পূর্ববর্তী ক্লাসের বৈশিষ্ট্য এবং কার্যকারিতা পুনর্ব্যবহার করা যায়।
- পলিমরফিজম: একই মেথড বিভিন্ন ক্লাসে ভিন্নভাবে ব্যবহার করে কোডকে আরও ফ্লেক্সিবল করা যায়।
Swift-এর ইনহেরিটেন্স এবং পলিমরফিজম OOP কনসেপ্টের মাধ্যমে প্রোগ্রামিংকে আরও কার্যকর ও সুসংগঠিত করতে সহায়ক।
Swift-এ ইনিশিয়ালাইজার এবং ডিনিশিয়ালাইজার
Swift-এ ইনিশিয়ালাইজার এবং ডিনিশিয়ালাইজার অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের দুটি গুরুত্বপূর্ণ অংশ, যা ক্লাস বা স্ট্রাক্ট অবজেক্ট তৈরি ও মুছে ফেলার সময় ব্যবহৃত হয়। ইনিশিয়ালাইজার অবজেক্ট তৈরি করার সময় প্রোপার্টিজ সেট করতে সাহায্য করে, আর ডিনিশিয়ালাইজার অবজেক্ট ধ্বংস করার সময় নির্দিষ্ট কাজ করতে ব্যবহৃত হয়।
ইনিশিয়ালাইজার (Initializer)
ইনিশিয়ালাইজার একটি বিশেষ মেথড, যা ক্লাস, স্ট্রাক্ট, বা এনাম-এর একটি নতুন ইনস্ট্যান্স তৈরি করার সময় কল করা হয়। এটি অবজেক্টের প্রোপার্টিজগুলির প্রাথমিক মান সেট করতে এবং প্রয়োজনীয় কাজ করতে ব্যবহৃত হয়। Swift-এ ইনিশিয়ালাইজারকে init কীওয়ার্ড দিয়ে ডিফাইন করা হয়।
ইনিশিয়ালাইজারের বৈশিষ্ট্য
- ইনিশিয়ালাইজার ডিফল্টভাবে কোনো রিটার্ন টাইপ রাখে না।
- ইনিশিয়ালাইজার এক বা একাধিক প্যারামিটার গ্রহণ করতে পারে।
- Swift-এ ক্লাস বা স্ট্রাক্টের জন্য একটি ডিফল্ট ইনিশিয়ালাইজার থাকে, তবে আপনি কাস্টম ইনিশিয়ালাইজারও তৈরি করতে পারেন।
উদাহরণ: স্ট্রাক্টে ইনিশিয়ালাইজার
struct Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let person = Person(name: "Alice", age: 25)
print("Name: \(person.name), Age: \(person.age)")
এখানে, Person স্ট্রাক্টের একটি ইনিশিয়ালাইজার ডিফাইন করা হয়েছে, যা name এবং age প্রোপার্টিজের মান সেট করতে ব্যবহৃত হয়েছে। যখন Person এর একটি নতুন ইনস্ট্যান্স তৈরি করা হয়, তখন ইনিশিয়ালাইজার এই প্রোপার্টিজগুলির মান সেট করে।
উদাহরণ: ক্লাসে ইনিশিয়ালাইজার
class Car {
var brand: String
var model: String
var year: Int
init(brand: String, model: String, year: Int) {
self.brand = brand
self.model = model
self.year = year
}
}
let myCar = Car(brand: "Toyota", model: "Corolla", year: 2020)
print("Brand: \(myCar.brand), Model: \(myCar.model), Year: \(myCar.year)")
এখানে, Car ক্লাসের একটি ইনিশিয়ালাইজার ডিফাইন করা হয়েছে, যা তিনটি প্যারামিটার গ্রহণ করে এবং অবজেক্টের প্রোপার্টিজ সেট করে।
ডিফল্ট ইনিশিয়ালাইজার এবং কাস্টম ইনিশিয়ালাইজার
- ডিফল্ট ইনিশিয়ালাইজার: যদি কোনো ইনিশিয়ালাইজার না দেওয়া হয়, Swift একটি ডিফল্ট ইনিশিয়ালাইজার তৈরি করে।
- কাস্টম ইনিশিয়ালাইজার: যখন আপনার প্রোপার্টিজগুলো কাস্টম ভ্যালু দিয়ে ইনিশিয়ালাইজ করতে হয় বা কিছু নির্দিষ্ট কাজ করতে হয়, তখন আপনি কাস্টম ইনিশিয়ালাইজার তৈরি করতে পারেন।
ফেইলেবল ইনিশিয়ালাইজার (Failable Initializer)
Swift-এ আপনি একটি ফেইলেবল ইনিশিয়ালাইজারও তৈরি করতে পারেন, যা ইনিশিয়ালাইজেশন ব্যর্থ হলে nil রিটার্ন করে। এটি init? সিনট্যাক্স দিয়ে ডিফাইন করা হয়।
struct Product {
var name: String
var price: Double
init?(name: String, price: Double) {
if price < 0 {
return nil
}
self.name = name
self.price = price
}
}
if let product = Product(name: "Laptop", price: -1500) {
print("Product: \(product.name), Price: \(product.price)")
} else {
print("Invalid product price.")
}
এখানে, যদি প্রাইস নেগেটিভ হয়, তাহলে ইনিশিয়ালাইজার nil রিটার্ন করে, যা একটি অবৈধ অবজেক্ট তৈরি হতে বাধা দেয়।
ডিনিশিয়ালাইজার (Deinitializer)
Swift-এ ডিনিশিয়ালাইজার একটি বিশেষ মেথড, যা ক্লাসের একটি ইনস্ট্যান্স ধ্বংস হওয়ার সময় স্বয়ংক্রিয়ভাবে কল করা হয়। এটি deinit কীওয়ার্ড দিয়ে ডিফাইন করা হয় এবং এটি সাধারণত মেমোরি রিসোর্স রিলিজ করার জন্য ব্যবহৃত হয়। ডিনিশিয়ালাইজার শুধুমাত্র ক্লাসে থাকে, স্ট্রাক্ট বা এনাম-এ থাকে না।
ডিনিশিয়ালাইজারের বৈশিষ্ট্য
- ডিনিশিয়ালাইজারের কোনো প্যারামিটার বা রিটার্ন টাইপ থাকে না।
- এটি শুধুমাত্র ক্লাসের জন্য প্রযোজ্য।
- একটি অবজেক্ট মেমোরি থেকে সরানোর আগে ডিনিশিয়ালাইজার কল করা হয়।
উদাহরণ: ডিনিশিয়ালাইজার ব্যবহার
class FileHandler {
var fileName: String
init(fileName: String) {
self.fileName = fileName
print("\(fileName) is opened.")
}
deinit {
print("\(fileName) is closed.")
}
}
if true {
let file = FileHandler(fileName: "data.txt")
// এখানে ফাইল হ্যান্ডলার ব্যবহার করা হচ্ছে
}
// যখন অবজেক্ট মেমোরি থেকে সরানো হবে, তখন deinit কল হবে।
আউটপুট:
data.txt is opened.
data.txt is closed.
এখানে, FileHandler ক্লাসের ডিনিশিয়ালাইজার অবজেক্ট ধ্বংস হওয়ার সময় প্রিন্ট করবে। কোড ব্লকের শেষে (এখানে if true ব্লক) অবজেক্টটি মেমোরি থেকে মুছে ফেলা হয় এবং ডিনিশিয়ালাইজার স্বয়ংক্রিয়ভাবে কল হয়।
উপসংহার
- ইনিশিয়ালাইজার (Initializer): Swift-এ অবজেক্ট তৈরি করার সময় প্রোপার্টিজ সেট এবং অন্যান্য প্রাথমিক কাজ করতে ব্যবহৃত হয়। ইনিশিয়ালাইজার কাস্টমাইজ করা যায় এবং এমনকি ফেইলেবল ইনিশিয়ালাইজারও তৈরি করা যায়।
- ডিনিশিয়ালাইজার (Deinitializer): একটি ক্লাসের অবজেক্ট মেমোরি থেকে সরানোর সময় স্বয়ংক্রিয়ভাবে কল হয় এবং এটি সাধারণত মেমোরি ক্লিনআপ বা রিসোর্স রিলিজ করার জন্য ব্যবহৃত হয়।
Swift-এ ইনিশিয়ালাইজার এবং ডিনিশিয়ালাইজার প্রোগ্রামিং প্রক্রিয়াকে আরও কার্যকর এবং নিরাপদ করে, কারণ এটি ডেটা সেটআপ এবং ক্লিনআপ উভয় ক্ষেত্রেই নিয়ন্ত্রণ দেয়।
Swift-এ self এবং super কীওয়ার্ড
Swift-এ self এবং super কীওয়ার্ড দুটি গুরুত্বপূর্ণ, যা ক্লাস বা স্ট্রাকচারে কাজ করার সময় প্রায়ই ব্যবহৃত হয়। এগুলি ক্লাসের প্রপার্টি এবং মেথড ম্যানিপুলেশন এবং ওভাররাইড মেথডগুলির অ্যাক্সেসের জন্য ব্যবহার করা হয়।
১. self কীওয়ার্ড
selfকীওয়ার্ডটি বর্তমান ক্লাস বা স্ট্রাকচারের ইনস্ট্যান্সকে নির্দেশ করে।- এটি সাধারণত প্রপার্টি বা মেথড অ্যাক্সেস এবং ইনিশিয়ালাইজারে প্যারামিটার ও প্রপার্টির মধ্যে পার্থক্য করতে ব্যবহৃত হয়।
উদাহরণ:
class Person {
var name: String
init(name: String) {
self.name = name // এখানে self.name বর্তমান অবজেক্টের প্রপার্টি নির্দেশ করছে
}
func greet() {
print("Hello, \(self.name)!")
}
}
let person = Person(name: "Alice")
person.greet() // আউটপুট: "Hello, Alice!"
২. super কীওয়ার্ড
superকীওয়ার্ড প্যারেন্ট বা সুপার ক্লাসের মেথড এবং প্রপার্টি অ্যাক্সেস করতে ব্যবহৃত হয়।- এটি সাধারণত ইনহেরিটেন্সে ওভাররাইড মেথডের মাধ্যমে প্যারেন্ট ক্লাসের কার্যকারিতা বজায় রাখতে ব্যবহৃত হয়।
উদাহরণ:
class Animal {
func makeSound() {
print("Animal sound")
}
}
class Dog: Animal {
override func makeSound() {
super.makeSound() // প্যারেন্ট ক্লাসের মেথড কল করছে
print("Bark")
}
}
let dog = Dog()
dog.makeSound()
// আউটপুট:
// "Animal sound"
// "Bark"
সংক্ষেপে
self: বর্তমান ক্লাস বা ইনস্ট্যান্সের প্রপার্টি ও মেথড নির্দেশ করতে।super: প্যারেন্ট ক্লাসের প্রপার্টি ও মেথড অ্যাক্সেস করতে।
এগুলি ব্যবহার করে কোডকে সুসংহত এবং পুনঃব্যবহারযোগ্য করা যায়।
Read more