Objective-C তে @protocol ডিরেক্টিভ ব্যবহার করা হয় প্রটোকল ডিফাইন করার জন্য। প্রটোকল হল একটি চুক্তি বা এক ধরনের কনট্র্যাক্ট, যা একটি ক্লাসকে নির্দিষ্ট মেথড ইমপ্লিমেন্ট করতে বলে। প্রটোকল দ্বারা আপনি একটি নির্দিষ্ট ইন্টারফেস (interface) নির্ধারণ করতে পারেন, কিন্তু এর মধ্যে মেথডের বাস্তবায়ন (implementation) করা হয় না। এটি কোডের পুনঃব্যবহারযোগ্যতা এবং মডুলারিটি বাড়াতে সাহায্য করে।
Objective-C তে প্রটোকল দুটি প্রধানভাবে ব্যবহৃত হয়:
- ডেলিগেট প্যাটার্ন: এক ক্লাস আরেক ক্লাসের কার্যাবলী বা অ্যাকশনগুলির উপর নজর রাখে।
- ডাটা শেয়ারিং: একাধিক ক্লাসে একরকম কার্যকলাপকে শেয়ার করা।
@protocol ডিরেক্টিভের সিনট্যাক্স
প্রটোকল ডিফাইন করতে @protocol ডিরেক্টিভ ব্যবহার করা হয়, এবং ক্লাস এই প্রটোকল অনুসরণ (conform) করে।
সিনট্যাক্স:
@protocol ProtocolName
// মেথড ডিক্লেয়ারেশন
- (void) methodName;
@endএখানে:
- ProtocolName: প্রটোকলের নাম।
- methodName: প্রটোকল এ ডিক্লেয়ার করা মেথড।
প্রটোকল ইমপ্লিমেন্টেশন (Protocol Implementation)
একটি ক্লাস প্রটোকল অনুসরণ (conform) করলে, সেটি প্রটোকলের মেথড ইমপ্লিমেন্ট করতে বাধ্য হয়। ক্লাসে প্রটোকল ইমপ্লিমেন্ট করার জন্য, <ProtocolName> সাইন ব্যবহার করা হয়।
উদাহরণ:
- প্রটোকল ডিফাইন করা (protocol definition):
// MyProtocol.h
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
// প্রটোকলের মেথড ডিক্লেয়ারেশন
- (void) sayHello;
- (void) greetWithName:(NSString *)name;
@end- প্রটোকল ইমপ্লিমেন্টেশন (protocol implementation):
// MyClass.h
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface MyClass : NSObject <MyProtocol> // প্রটোকল কনফর্ম করা
// প্রপার্টি বা মেথড ডিক্লেয়ারেশন
- (void) sayHello;
- (void) greetWithName:(NSString *)name;
@end// MyClass.m
#import "MyClass.h"
@implementation MyClass
// প্রটোকল মেথড ইমপ্লিমেন্টেশন
- (void) sayHello {
NSLog(@"Hello!");
}
- (void) greetWithName:(NSString *)name {
NSLog(@"Hello, %@!", name);
}
@end- প্রটোকল ব্যবহার:
// main.m
#import <Foundation/Foundation.h>
#import "MyClass.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyClass *obj = [[MyClass alloc] init];
[obj sayHello]; // MyProtocol এর sayHello মেথড কল হচ্ছে
[obj greetWithName:@"John"]; // MyProtocol এর greetWithName মেথড কল হচ্ছে
}
return 0;
}এখানে, MyClass ক্লাসটি MyProtocol প্রটোকল অনুসরণ (conform) করেছে এবং এর মেথডগুলি ইমপ্লিমেন্ট করেছে। sayHello এবং greetWithName: মেথড দুটি প্রটোকল থেকে এসেছে এবং ক্লাসের মধ্যে বাস্তবায়িত হয়েছে।
প্রটোকলের Optional মেথড
Objective-C তে আপনি কিছু মেথডকে optional বা ঐচ্ছিক হিসেবে চিহ্নিত করতে পারেন। এটি করার জন্য @optional ডিরেক্টিভ ব্যবহার করা হয়। প্রটোকলের কিছু মেথড ঐচ্ছিক করা হলে, ক্লাসগুলো ঐ মেথডগুলি ইমপ্লিমেন্ট নাও করতে পারে।
উদাহরণ:
@protocol MyProtocol <NSObject>
@required
- (void) requiredMethod;
@optional
- (void) optionalMethod;
@endএখানে:
@requiredদিয়ে আপনি মেথডটি বাধ্যতামূলক করেন।@optionalদিয়ে আপনি মেথডটি ঐচ্ছিক করে দেন।
প্রটোকলের ডেলিগেট প্যাটার্ন
একটি সাধারণ ব্যবহারিক উদাহরণ হলো ডেলিগেট প্যাটার্ন। এতে একটি ক্লাস অন্য ক্লাসের কার্যাবলী পরিচালনা করার জন্য প্রটোকল ব্যবহার করে। উদাহরণস্বরূপ, আপনি একটি UIViewController ক্লাসে ডেলিগেট ব্যবহার করতে পারেন, যা একটি TableView এর ডেটা পরিচালনা করে।
// TableViewDelegate.h
@protocol TableViewDelegate <NSObject>
- (void) didSelectRowAtIndex:(NSInteger)index;
@end// TableViewController.h
#import <UIKit/UIKit.h>
#import "TableViewDelegate.h"
@interface TableViewController : UIViewController
@property (nonatomic, weak) id<TableViewDelegate> delegate;
@end// MainViewController.h
#import <UIKit/UIKit.h>
#import "TableViewDelegate.h"
@interface MainViewController : UIViewController <TableViewDelegate>
@end// MainViewController.m
@implementation MainViewController
- (void) didSelectRowAtIndex:(NSInteger)index {
NSLog(@"Row at index %ld selected", (long)index);
}
@endএখানে, MainViewController TableViewDelegate প্রটোকল অনুসরণ করছে এবং didSelectRowAtIndex: মেথডটি ইমপ্লিমেন্ট করেছে। যখন TableViewController একটি রো নির্বাচন করবে, তখন এটি ডেলিগেটের মাধ্যমে MainViewController-এ পৌঁছাবে।
উপসংহার
@protocolডিরেক্টিভ ব্যবহার করে আপনি একটি প্রটোকল তৈরি করতে পারেন, যা ক্লাসগুলোকে নির্দিষ্ট মেথড ইমপ্লিমেন্ট করার নির্দেশনা দেয়।- প্রটোকল ব্যবহারের মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা, মডুলারিটি এবং নমনীয়তা বৃদ্ধি পায়।
@requiredএবং@optionalডিরেক্টিভের মাধ্যমে আপনি মেথডগুলিকে বাধ্যতামূলক বা ঐচ্ছিক হিসেবে চিহ্নিত করতে পারেন।
এই কনসেপ্টগুলি Objective-C তে কোডকে আরও উন্নত, পরিষ্কার এবং মডুলার করে তোলে, বিশেষ করে যখন বড় অ্যাপ্লিকেশন ডেভেলপমেন্টে ডেলিগেট বা ইভেন্ট হ্যান্ডলিং প্রয়োজন হয়।
Read more