উদ্দেশ্য-সি-তে ওভারলোডিংয়ের পদ্ধতি?


131

আমার জ্ঞান হিসাবে, অবজেক্টিভ-সি পদ্ধতি ওভারলোডিং সমর্থন করে না। অবজেক্টিভ-সিতে এর বিকল্প কী হতে পারে? অথবা আমার সর্বদা আলাদা পদ্ধতির নাম ব্যবহার করা উচিত?

উত্তর:


193

সঠিক, উদ্দেশ্য-সি পদ্ধতি ওভারলোডিং সমর্থন করে না, তাই আপনাকে বিভিন্ন পদ্ধতির নাম ব্যবহার করতে হবে।

দ্রষ্টব্য, যদিও, "পদ্ধতির নাম" -এ পদ্ধতিতে স্বাক্ষরকারী কীওয়ার্ডগুলি রয়েছে (":" এর আগে উপস্থিত প্যারামিটারের নামগুলি), সুতরাং তারা দুটি "রাইটটফাইলে" শুরু করলেও নিম্নলিখিত দুটি ভিন্ন পদ্ধতি রয়েছে:

-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;

(দুটি পদ্ধতির নাম হ'ল "WritToFile: fromInt:" এবং "WritToFile: fromString:")।


4
@ রাহেলসাদিক এটি ওভারলোডিং নয় কারণ পদ্ধতির নামগুলি (ওবিজেসি: 'নির্বাচক') আলাদা are আলাদা হওয়ার কারণে উভয়কেই 'ওভারলোডেড' মনে করা হয় না। যদি WritToFile: থেকে: দু'বার সংজ্ঞায়িত করা হয়, কেবলমাত্র প্যারামিটারের ধরনগুলি আলাদা ছিল, তবে সেটি ওভারলোডিং হবে। যদিও বলা হয়েছে, এটি জাভা এবং এখন সুইফ্ট সহ অন্যান্য ভাষার মতো ওবিজেসি তে সমর্থনযোগ্য নয়।
ক্রিস হ্যাটন

প্যারামিটারের নাম কেবল নিজেরাই নয়, এমনকি কলোনগুলিও নামের নামের অংশ, যাতে - (শূন্য) WritToFile: (এনএসএসআরটিং *) পাথ: (ইনট) anInt; এবং - (অকার্যকর) WritToFile: (NSString ) পাথ: (NSString ) aString; এছাড়াও বিভিন্ন পদ্ধতি।
কায়সারলুদি

22

এটি উল্লেখযোগ্য হতে পারে যে যদিও ওজেক্টিভ-সি পদ্ধতি ওভারলোডিংকে সমর্থন না করে তবে ক্ল্যাং + এলএলভিএম সি জন্য ফাংশন ওভারলোডিং সমর্থন করে যদিও আপনি যা খুঁজছেন তা না হলেও এটি কিছু পরিস্থিতিতে কার্যকর প্রমাণিত হতে পারে (উদাহরণস্বরূপ, যখন বাস্তবায়ন সামান্য গভীর ক্ষত (এনক্যাপস্যুলেশন পরিপন্থী) সংস্করণ এর পরিদর্শক নকশা প্যাটার্ন )

ফাংশন ওভারলোডিং কীভাবে কাজ করে তার একটি সাধারণ উদাহরণ এখানে:

__attribute__((overloadable)) float area(Circle * this)
{
    return M_PI*this.radius*this.radius;
}

__attribute__((overloadable)) float area(Rectangle * this)
{
    return this.w*this.h;
}

//...
//In your Obj-C methods you can call:
NSLog(@"%f %f", area(rect), area(circle));

কেউ ভাবেন যে পদ্ধতিটি সুইজলিংয়ের সাথে এই সংকেতটি আসলে "ওভারলোডেবল" পদ্ধতির দিকে পরিচালিত করতে পারে ... তবে কেন প্রয়োজন হবে idএবং কেন তা isKindOfClass:নিষ্পত্তি করা হবে তা ভিন্ন গল্প ...
অ্যালেক্স গ্রে

1
@alexgray আমি আপনার পয়েন্টটি দেখতে পাচ্ছি idএবং isKindOfClass:বেশিরভাগ ব্যবহারিক পরিস্থিতিতে .েকে রাখছি । আপনি ওভারলোডিং পছন্দ করতে পারেন তার একটি কারণ, সর্বাধিক নির্দিষ্ট ধরণের ক্যাটারডের স্বয়ংক্রিয় নির্বাচন যা স্বতন্ত্র ধরণের চেকিংয়ের সাথে বজায় রাখতে একটি ছোট ওভারহেডকে ব্যয় করবে।
ক্রিস হ্যাটন

1
ক্ল্যাং ডকুমেন্টেশন স্পষ্টভাবে বলেছে যে এটি যা করে তা সি এর জন্য সি ++ নাম মংলিং সরবরাহ করে এবং এটি মূলত কেবল সংকলকটি স্বয়ংক্রিয়ভাবে দৃশ্যের পিছনে কিছু করে যা উদ্দেশ্যপ্রণালী-সিতে পদ্ধতিগুলির নাম দেয় যা ঘিরে (দীর্ঘতর আকারে) দ্বারা পৃথক পৃথক থাকে যুক্তি প্রকারের।
ক্রিস স্ট্রাটন

19

ডেভিড সেই পদ্ধতিতে সঠিক যে ওভারলোডিং উদ্দেশ্য-সিটিতে সমর্থিত নয় supported এটি সেই অর্থে পিএইচপি এর অনুরূপ। যেমনটি তিনি উল্লেখ করেছেন, তিনি যেভাবে উদাহরণ দিয়েছিলেন তার মধ্যে দুটি বা তারও বেশি পদ্ধতির বিভিন্ন স্বাক্ষর দিয়ে সংজ্ঞায়িত করা সাধারণ অনুশীলন। তবে "আইডি" টাইপ ব্যবহার করে একটি পদ্ধতি তৈরি করাও সম্ভব। "আইডি" টাইপের মাধ্যমে আপনি যেকোন অবজেক্ট (এবং এনএসএনম্বার ক্লাস ব্যবহার করে যে কোনও আদিম) পাঠাতে পারবেন এবং তারপরে মেথডের মধ্যে থেকেই আপনি এর ধরণটি পরীক্ষা করতে পারেন এবং প্রয়োজনে উপযুক্ত ব্যতিক্রম নিক্ষেপ করতে পারেন। যদিও এতে সামান্য পারফরম্যান্স হিট হয়েছে, আপনি সম্ভবত প্রচুর পরিমাণে ডেটা প্রক্রিয়াকরণ না করা হলে এটি সম্ভবত নামমাত্র বা তুচ্ছ হতে পারে।

- (void) writeToFile: (NSString *)path fromObject: (id)object {
    if (!([object isKindOfClass: [NSNumber class]] || [object isKindOfClass: [NSString class]])) {
         @throw [NSException exceptionWithName: @"InvalidArgumentException" reason: @"Unrecognized parameter type." userInfo: nil];
    }
}

এটি অবজেক্টের ধরণের প্রয়োগের জন্য একটি প্রোটোকল প্রয়োগ করার জন্য একটি সুন্দর জায়গা, যা এটির মতো করা যায়:

(id<MyProtocol>)object
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.