উত্তর:
অন্যান্য উত্তরগুলির মতো বেশিরভাগই বলেছেন যে, উদাহরণের পদ্ধতিগুলি একটি শ্রেণীর উদাহরণ ব্যবহার করে, যেখানে একটি শ্রেণির পদ্ধতিটি কেবল শ্রেণির নাম সহ ব্যবহার করা যেতে পারে। উদ্দেশ্য-সি এগুলি এভাবে সংজ্ঞায়িত করা হয়:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
সেগুলি তখন এর মতো ব্যবহার করা যেতে পারে:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
বর্গ পদ্ধতি কিছু বাস্তব জগতে উদাহরণ মত অনেক ফাউন্ডেশন শ্রেণীর উপর সুবিধার পদ্ধতি NSString
'র +stringWithFormat:
বা NSArray
এর +arrayWithArray:
। একটি উদাহরণ পদ্ধতি NSArray
হ'ল -count
পদ্ধতি।
সমস্ত প্রযুক্তিগত বিবরণ অন্যান্য উত্তরে খুব সুন্দরভাবে কভার করা হয়েছে। আমি কেবল একটি সাধারণ উপমা ভাগ করতে চাই যা আমার মনে হয় যে একটি বর্গ এবং উদাহরণের মধ্যে পার্থক্যটি সুন্দরভাবে বর্ণনা করে:
একটি শ্রেণি একটি বাড়ির ব্লুপ্রিন্টের মতো : আপনার কেবল একটি নীলনকশা রয়েছে এবং (সাধারণত) আপনি কেবল নীলনকশা দিয়ে এত কিছু করতে পারবেন না।
একটি উদাহরণ (বা কোনও অবজেক্ট ) হ'ল আসল বাড়ি যা আপনি নীল ছাপের উপর ভিত্তি করে তৈরি করেন: আপনি একই ব্লুপ্রিন্ট থেকে প্রচুর ঘর তৈরি করতে পারেন। তারপরে আপনি প্রতিটি বাড়ির দেয়ালগুলিকে আলাদা রঙ করতে পারেন ঠিক যেমন আপনি অন্যান্য দৃষ্টান্তগুলিকে প্রভাবিত না করে কোনও শ্রেণীর প্রতিটি উদাহরণের বৈশিষ্ট্যগুলি স্বাধীনভাবে পরিবর্তন করতে পারেন।
difference between class method and an instance method
;
অন্যান্য উত্তরগুলির মতোই বলা হয়েছে, উদাহরণের পদ্ধতিগুলি কোনও বস্তুর উপর পরিচালিত হয় এবং তার উদাহরণের ভেরিয়েবলগুলির অ্যাক্সেস থাকে, যখন একটি শ্রেণি পদ্ধতি একটি সামগ্রিকভাবে একটি শ্রেণিতে কাজ করে এবং নির্দিষ্ট উদাহরণের ভেরিয়েবলগুলিতে অ্যাক্সেস থাকে না (যদি আপনি উদাহরণটি পাস না করেন তবে প্যারামিটার)।
শ্রেণি পদ্ধতির একটি ভাল উদাহরণ হ'ল একটি পাল্টা ধরণের পদ্ধতি, যা একটি শ্রেণীর মোট উদাহরণগুলির সংখ্যা প্রদান করে। ক্লাসের পদ্ধতিগুলি একটি দিয়ে শুরু হয় +
, যখন উদাহরণগুলি একটি দিয়ে শুরু হয় -
। উদাহরণ স্বরূপ:
static int numberOfPeople = 0;
@interface MNPerson : NSObject {
int age; //instance variable
}
+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end
@implementation MNPerson
- (id)init{
if (self = [super init]){
numberOfPeople++;
age = 0;
}
return self;
}
+ (int)population{
return numberOfPeople;
}
- (int)age{
return age;
}
@end
main.m:
MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);
আউটপুট: বয়স: 0 লোক সংখ্যা: 2
আরেকটি উদাহরণ হ'ল যদি আপনার এমন কোনও পদ্ধতি থাকে যা আপনি চান যে ব্যবহারকারী কল করতে সক্ষম হন, কখনও কখনও এটি ক্লাস পদ্ধতি হিসাবে তৈরি করা ভাল। উদাহরণস্বরূপ, আপনার যদি ম্যাথফিউশনস নামে একটি শ্রেণি থাকে তবে আপনি এটি করতে পারেন:
+ (int)square:(int)num{
return num * num;
}
তাহলে ব্যবহারকারী কল করবে:
[MathFunctions square:34];
কখনও ক্লাস ইনস্ট্যান্ট ছাড়া!
আপনি এনএসআরির মতো অটোরিলেজড অবজেক্টগুলি ফিরিয়ে দেওয়ার জন্য শ্রেণিকরণও ব্যবহার করতে পারেন
+ (NSArray *)arrayWithObject:(id)object
এটি একটি অবজেক্ট নেয়, এটিকে অ্যারে রাখে এবং অ্যারের একটি স্বতঃস্ফূর্ত সংস্করণ প্রদান করে যা মেমরি পরিচালিত হতে হবে না, অস্থায়ী অ্যারেগুলির জন্য দুর্দান্ত এবং কী নয়।
আমি আশা করি আপনি কখন এবং / বা আপনার কেন ক্লাসের পদ্ধতি ব্যবহার করা উচিত তা বুঝতে পেরেছেন !!
একটি উদাহরণ পদ্ধতি শ্রেণীর উদাহরণ হিসাবে প্রয়োগ হয় (অর্থাত্ কোনও বস্তু) যেখানে একটি শ্রেণি পদ্ধতি ক্লাসের মধ্যেই প্রযোজ্য।
সি # তে একটি শ্রেণি পদ্ধতি স্থির হিসাবে চিহ্নিত হয়। স্থিতিশীল হিসাবে চিহ্নিত নয় এমন পদ্ধতি এবং বৈশিষ্ট্য হ'ল উদাহরণ পদ্ধতি।
class Foo {
public static void ClassMethod() { ... }
public void InstanceMethod() { ... }
}
আপনার প্রশ্নের উত্তর উদ্দেশ্য-সি সম্পর্কিত সুনির্দিষ্ট নয়, তবে বিভিন্ন ভাষায় শ্রেণিবদ্ধ পদ্ধতিগুলিকে স্ট্যাটিক পদ্ধতি বলা যেতে পারে।
শ্রেণি পদ্ধতি এবং উদাহরণ পদ্ধতির মধ্যে পার্থক্য
ক্লাস পদ্ধতি
তাত্ক্ষণিক পদ্ধতি
আমি মনে করি এটি বোঝার সর্বোত্তম উপায় হ'ল alloc
এবং init
। এই ব্যাখ্যাটিই আমাকে পার্থক্যগুলি বুঝতে সাহায্য করেছিল।
ক্লাস পদ্ধতি
পুরোপুরি ক্লাসে একটি ক্লাস পদ্ধতি প্রয়োগ করা হয়। আপনি যদি alloc
পদ্ধতিটি পরীক্ষা করেন তবে এটি একটি শ্রেণিবদ্ধ পদ্ধতি যা দ্বারা নির্দেশিত+
যা পদ্ধতি ঘোষণার আগে । এটি একটি শ্রেণি পদ্ধতি কারণ এটি শ্রেণীর একটি নির্দিষ্ট উদাহরণ তৈরি করতে শ্রেণিতে প্রয়োগ করা হয়।
তাত্ক্ষণিক পদ্ধতি
আপনি ক্লাসের চেয়ে সম্পূর্ণ ক্লাসের পরিবর্তে কোনও শ্রেণীর নির্দিষ্ট উদাহরণটি সংশোধন করতে একটি উদাহরণ পদ্ধতি ব্যবহার করেন। init
উদাহরণস্বরূপ ( -
পদ্ধতি ঘোষণার আগে একটি দিয়ে বোঝানো), একটি উদাহরণ পদ্ধতি কারণ আপনি সাধারণত শ্রেণীর তৈরি হওয়ার পরে এটির বৈশিষ্ট্যগুলি পরিবর্তন করছেন alloc
।
উদাহরণ
NSString *myString = [NSString alloc];
শ্রেণীর alloc
কোনও উদাহরণ উত্পন্ন করতে আপনি ক্লাস পদ্ধতিটি কল করছেন । লক্ষ্য করুন কীভাবে বার্তা গ্রহণকারী একটি শ্রেণি।
[myString initWithFormat:@"Hope this answer helps someone"];
আপনি এর উদাহরণ হিসেবে বলা যায় পরিবর্তন হয় NSString
নামক myString
যে উদাহরণস্বরূপ কিছু বৈশিষ্ট্য সেট করে। লক্ষ্য করুন কীভাবে বার্তা গ্রহণকারী একটি উদাহরণ (শ্রেণীর অবজেক্ট NSString
)।
alloc
অবজেক্টের জন্য পর্যাপ্ত মেমরি বরাদ্দ করে, বস্তুর init
অবস্থা নির্ধারণ করতে সেই মেমরি ঠিকানার মধ্যে যা রয়েছে তা সংশোধন করবে। আমরা কোনও অবজেক্টটিকে সংশোধন করার জায়গা না থাকলে তাকে সংশোধন করতে পারি না, তাই আমরা alloc
ক্লাসে ব্যবহার করি যা আমাদের সেই জায়গাটি দেবে বলে সিদ্ধান্ত নেবে।
শ্রেণীর পদ্ধতিগুলি সাধারণত শ্রেণীর উদাহরণ তৈরি করতে ব্যবহৃত হয়
উদাহরণস্বরূপ, এটি পাঠানো প্যারামিটারের সাথে [NSString stringWithFormat:@"SomeParameter"];
একটি NSString
উদাহরণ দেয়। সুতরাং এটি যেহেতু এটি একটি শ্রেণিবদ্ধ পদ্ধতি যা এর ধরণের কোনও অবজেক্টকে ফেরত দেয়, এটিকে একটি সুবিধা পদ্ধতিও বলা হয়।
সুতরাং আমি যদি এটি সঠিকভাবে বুঝতে পারি।
কোনও class
পদ্ধতির আপনাকে এটি ব্যবহার / প্রক্রিয়া করার জন্য সেই অবজেক্টের উদাহরণ বরাদ্দ করতে হবে না। একটি class
পদ্ধতি স্বয়ংসম্পূর্ণ এবং সেগুলি শ্রেণীর কোনও বস্তুর অবস্থার কোনও নির্ভরতা ছাড়াই পরিচালনা করতে পারে। একটি class
পদ্ধতি তার নিজের সমস্ত কাজের জন্য মেমরি বরাদ্দ করবে এবং সম্পন্ন হওয়ার পরে ডিএলোকট করবে, যেহেতু class শ্রেণীর কোনও উদাহরণ পূর্ববর্তী কলগুলিতে বরাদ্দকৃত কোনও মেমরি ক্লাস পদ্ধতিতে মুক্ত করতে সক্ষম হবে না।
একজন instance
পদ্ধতি ঠিক বিপরীত। আপনি যদি শ্রেণীর কোনও উদাহরণ বরাদ্দ না করেন তবে আপনি এটি কল করতে পারবেন না। এটি একটি সাধারণ বর্গের মতো যার একটি নির্মাণকারী রয়েছে এবং এতে একজন ডেস্ট্রাক্টর থাকতে পারে (যা বরাদ্দকৃত সমস্ত স্মৃতি পরিষ্কার করে)।
বেশিরভাগ সম্ভাবনায় (আপনি যদি পুনরায় ব্যবহারযোগ্য গ্রন্থাগার না লিখে থাকেন তবে আপনার class
ভেরিয়েবলের প্রয়োজন হবে না) ।
উদাহরণস্বরূপ এমন একটি গেম নিন যেখানে প্রচুর গাড়ি তৈরি হয় .. প্রত্যেকটি শ্রেণির সিসিআর এর অন্তর্গত। যখন কোনও গাড়ি তাত্ক্ষণিক হয় তখন তা কল করে
[CCar registerCar:self]
সুতরাং সিসিআর ক্লাস, প্রতিটি সিসিআর ইনস্ট্যান্টিয়েন্টের একটি তালিকা তৈরি করতে পারে। আসুন যাক ব্যবহারকারী কোনও স্তর শেষ করে, এবং সমস্ত গাড়ি সরিয়ে ফেলতে চায় ... আপনি যে কোনওটি করতে পারেন: 1- আপনি নিজে তৈরি করা প্রতিটি সিসার একটি তালিকাতে যান এবং করুনwhicheverCar.remove();
বা 2- সিসকারে একটি সরানো সমস্ত কার্ড পদ্ধতি যুক্ত করুন, যা এটি করবে আপনি যখন [সিসার অপসারণ সমস্ত কার্ড] কল করবেন তখন আপনার জন্য। অর্থাত allCars[n].remove();
বা উদাহরণস্বরূপ, আপনি ব্যবহারকারীর পুরো অ্যাপ্লিকেশনটির জন্য একটি ডিফল্ট ফন্টের আকার নির্দিষ্ট করার মঞ্জুরি দেন যা প্রারম্ভকালে লোড এবং সংরক্ষণ করা হয়। ক্লাস পদ্ধতি না থাকলে আপনাকে এমন কিছু করতে হতে পারে
fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();
ক্লাস পদ্ধতিটি দিয়ে আপনি পালাতে পারবেন [FontHandler getDefaultFontSize]
।
আপনার রিমুভওয়ালস ফাংশন হিসাবে, আপনি দেখতে পাবেন যে সি # এর মতো ভাষাগুলিতে টোলওয়ার বা টুঅপারের মতো কয়েকটি নির্দিষ্ট পদ্ধতি রয়েছে।
উদাঃ myString.removeVowels()
এবং String.removeVowels(myString)
(ওবজিসিতে এটি হবে would[String removeVowels:myString]
)।
এই ক্ষেত্রে উদাহরণটি সম্ভবত শ্রেণি পদ্ধতি কল করে, তাই উভয় উপলব্ধ। অর্থাত
public function toLower():String{
return String.toLower();
}
public static function toLower( String inString):String{
//do stuff to string..
return newString;
}
মূলত myString.toLower()
কলগুলি [String toLower:ownValue]
এর কোন সুস্পষ্ট উত্তর নেই, তবে আপনি যদি মনে করেন যে কোনও শ্রেণির পদ্ধতিটি আপনার কোডকে উন্নত করবে, একটি শট দেবে এবং মনে রাখবেন যে কোনও শ্রেণি পদ্ধতি আপনাকে কেবল অন্য শ্রেণীর পদ্ধতি / ভেরিয়েবলগুলি ব্যবহার করতে দেয়।
বর্গ পদ্ধতি
স্ট্যাটিক হিসাবে ঘোষণা করা হয় যা পদ্ধতি। ক্লাসের উদাহরণ তৈরি না করেই পদ্ধতিটি বলা যেতে পারে। ক্লাস পদ্ধতিগুলি কেবল শ্রেণীর সদস্যদের উপরই পরিচালনা করতে পারে এবং উদাহরণের সদস্যদের জন্য নয় কারণ শ্রেণি পদ্ধতিগুলি উদাহরণ সদস্যদের সম্পর্কে অজানা। শ্রেণীর ইনস্ট্যান্স পদ্ধতিগুলিও শ্রেণীর কোনও পদ্ধতির মধ্যে থেকে কল করা যায় না যতক্ষণ না সেগুলি শ্রেণীর উদাহরণ হিসাবে ডাকা হয় না।
তাত্ক্ষণিক পদ্ধতি
অন্যদিকে শ্রেণীর নামকরণের আগে তাদের উপস্থিতির একটি উদাহরণ প্রয়োজন, সুতরাং নতুন কীওয়ার্ড ব্যবহার করে কোনও শ্রেণির উদাহরণ তৈরি করা দরকার। ইনস্ট্যান্স পদ্ধতি ক্লাসের নির্দিষ্ট উদাহরণগুলিতে কাজ করে। তাত্ক্ষণিক পদ্ধতিগুলি স্থির হিসাবে ঘোষণা করা হয় না।
উদ্দেশ্য-সিতে সমস্ত পদ্ধতি একটি "-" বা "+" অক্ষর দিয়ে শুরু হয়। উদাহরণ:
@interface MyClass : NSObject
// instance method
- (void) instanceMethod;
+ (void) classMethod;
@end
"+" এবং "-" অক্ষর নির্দিষ্ট করে দেয় যে পদ্ধতিটি যথাক্রমে একটি class method
বা একটি কিনা instance method
।
পার্থক্য স্পষ্ট হবে যদি আমরা এই পদ্ধতিগুলি কল করি। এখানে পদ্ধতিগুলি ঘোষণা করা হয়েছে MyClass
।
instance method
শ্রেণীর উদাহরণ প্রয়োজন:
MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];
MyClass
অন্যান্য পদ্ধতির অভ্যন্তরে MyClass
ব্যবহারের উদাহরণ পদ্ধতিগুলি কল করতে পারে self
:
-(void) someMethod
{
[self instanceMethod];
}
তবে, class methods
ক্লাসে নিজেই ডাকা উচিত:
[MyClass classMethod];
বা:
MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];
এটি কাজ করবে না:
// Error
[myClass classMethod];
// Error
[self classMethod];
একটি শ্রেণি পদ্ধতি সাধারণত শ্রেণীর একটি নতুন উদাহরণ তৈরি করে বা শ্রেণীর কিছু বৈশ্বিক বৈশিষ্ট্য পুনরুদ্ধার করে। ক্লাস পদ্ধতিগুলি একটি উদাহরণে কাজ করে না বা উদাহরণ ভেরিয়েবলের কোনও অ্যাক্সেস রয়েছে।
একটি উদাহরণ পদ্ধতি ক্লাসের একটি নির্দিষ্ট উদাহরণে কাজ করে। উদাহরণস্বরূপ, আপনি যে অ্যাক্সেসরগুলি প্রয়োগ করেছেন সেটি হ'ল সমস্ত উদাহরণ পদ্ধতি। আপনি এগুলিকে নির্দিষ্ট কোনও অবজেক্টের উদাহরণ ভেরিয়েবল সেট করতে বা পেতে ব্যবহার করেন।
একটি উদাহরণ পদ্ধতিতে অনুরোধ জানাতে, আপনি ক্লাসের উদাহরণটিতে বার্তাটি প্রেরণ করেন।
কোনও শ্রেণি পদ্ধতিতে অনুরোধ করতে আপনি ক্লাসে সরাসরি বার্তাটি পাঠান।
উত্স: আইওএস - উদ্দেশ্য-সি - শ্রেণির পদ্ধতি এবং তাত্ক্ষণিক পদ্ধতি
শ্রেণি পদ্ধতিগুলি কোনও উদাহরণ ভেরিয়েবলের মান পরিবর্তন বা জানতে পারে না। উদাহরণস্বরূপ পদ্ধতিটি কোনও শ্রেণিবদ্ধ হতে পারে কিনা তা জানার জন্য এটি মাপদণ্ড হওয়া উচিত।
এছাড়াও মনে রাখবেন, একই ধারণাটি ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য। পদ্ধতিগুলি / ক্রিয়াকলাপগুলির জন্য আপনি যেমন চলকগুলি সম্পর্কে একই কথা বলছেন তখন আপনি স্থির, সদস্য, উদাহরণস্বরূপ, শ্রেণি ইত্যাদির মতো পদগুলি দেখতে পাবেন।
মনে হচ্ছে ওবজ-সি সম্প্রদায়ের সাধারণ শব্দটি উদাহরণস্বরূপ পরিবর্তনশীল হিসাবে আইভার, তবে আমি এখনও ওবজ-সি লোক নই।
উপরের উত্তরের একটি আপডেট, আমি সম্মত হচ্ছি যে পদ্ধতিগুলি কোনও শ্রেণীর উদাহরণ ব্যবহার করে, যেখানে একটি শ্রেণির পদ্ধতিটি কেবল শ্রেণীর নাম সহ ব্যবহার করা যেতে পারে।
উদ্দেশ্য পদ্ধতিতে স্বয়ংক্রিয় রেফারেন্স গণনা অস্তিত্ব আসার পরে উদাহরণ পদ্ধতি এবং শ্রেণীর পদ্ধতির মধ্যে আর কোনও পার্থক্য নেই।
উদাহরণস্বরূপ [NS StringWithformat:..]
একটি শ্রেণি পদ্ধতি এবং [[NSString alloc] initwihtformat:..]
একটি উদাহরণ পদ্ধতি, উভয়ই আরসি-র পরে এক হয় same
দ্রষ্টব্য: এটি কেবলমাত্র সিউডো কোড ফর্ম্যাটে
ক্লাস পদ্ধতি
প্রায় যা করা দরকার তা হ'ল সংকলনের সময় । এটির জন্য কোনও ব্যবহারকারীর ইনপুট লাগবে না, বা এর গণনা কোনও উদাহরণের ভিত্তিতে নয়। এ সম্পর্কে সমস্ত কিছুই বর্গ / ব্লুপ্রিন্টের উপর ভিত্তি করে —— যা অনন্য ie অর্থাৎ আপনার কাছে এক শ্রেণির জন্য একাধিক ব্লুপ্রিন্ট নেই। সংকলনের সময় আপনি কি বিভিন্ন প্রকারের থাকতে পারেন? না, সুতরাং শ্রেণিটি অনন্য এবং তাই আপনি যতবার ক্লাস পদ্ধতিতে কল করুন পয়েন্টারটি এটির নির্দেশক একই হবে।
PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.
তাত্ক্ষণিক পদ্ধতি
বিপরীতে উদাহরণ পদ্ধতিটি রানটাইমের সময় ঘটে থাকে, কারণ এটি তখনই আপনি এমন কোনও উদাহরণ তৈরি করেছেন যা প্রতিটি তাত্ক্ষণিক ক্ষেত্রে পৃথক হতে পারে।
initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
//As you can see the value can change for each instance.
আপনি যদি অন্য ভাষা থেকে আসেন তবে স্থির পদ্ধতিগুলি শ্রেণিবদ্ধের মতো same
আপনি যদি সুইফ্ট থেকে আসছেন তবে টাইপ পদ্ধতি শ্রেণিবদ্ধের মতো as
উপরের উত্তরে যুক্ত করা হচ্ছে
ক্লাস পদ্ধতি ক্লাসে কাজ করবে, আমরা এটিকে সাধারণ উদ্দেশ্যে ব্যবহার করব যেখানে স্ট্রিংউইথফোর্ম্যাট, শ্রেণীর আকার এবং সর্বাধিক গুরুত্বপূর্ণভাবে ডি আর ইত্যাদির জন্য use
NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat];
ইনস্ট্যান্স মেথড ক্লাসে নয় এমন ক্লাসের উদাহরণে কাজ করবে যেমন আমাদের দু'জন ব্যক্তি রয়েছেন এবং আমরা এখানে আলাদা আলাদাভাবে প্রতিটিটির ভারসাম্য জানতে চাই আমাদের উদাহরণ পদ্ধতিটি ব্যবহার করা দরকার। কারণ এটি সাধারণ প্রতিক্রিয়া ফিরিয়ে দেবে না। যেমন এনএসএসআরির গণনা নির্ধারণ ইত্যাদি
[johnson getAccountBalance];
[ankit getAccountBalance];