আমি জাভা জানি, এবং এখন আমি অবজেক্টিভ-সি শিখছি। জাভা ইন্টারফেস এবং অবজেক্টিভ-সি প্রোটোকলের মধ্যে ঠিক কী পার্থক্য রয়েছে?
আমি জাভা জানি, এবং এখন আমি অবজেক্টিভ-সি শিখছি। জাভা ইন্টারফেস এবং অবজেক্টিভ-সি প্রোটোকলের মধ্যে ঠিক কী পার্থক্য রয়েছে?
উত্তর:
প্রথমে, জাভাটির অন্যতম নির্মাতাদের থেকে এই বিষয়ে সামান্য historicalতিহাসিক দৃষ্টিভঙ্গি । এর পরে, উইকিপিডিয়ায় অবজেক্টিভ-সি প্রোটোকলগুলিতে একটি মাঝারি সহায়ক সহায়ক বিভাগ রয়েছে । বিশেষত, বুঝতে হবে যে অবজেক্টিভ-সি উভয় প্রথাগত প্রোটোকলকে সমর্থন করে (যা @protocolকীওয়ার্ডের সাথে স্পষ্টভাবে ঘোষিত হয় , একটি জাভা ইন্টারফেসের সমতুল্য) এবং অনানুষ্ঠানিক প্রোটোকল (কেবলমাত্র একটি বা একাধিক পদ্ধতি শ্রেণীর দ্বারা প্রয়োগ করা হয়েছে, যা প্রতিফলনের মাধ্যমে আবিষ্কার করা যেতে পারে)।
আপনি যদি কোনও আনুষ্ঠানিক প্রোটোকল গ্রহণ করেন ("ইন্টারফেস প্রয়োগের জন্য" উদ্দেশ্য-সি টার্মিনোলজির) সংকলকটি জাভাতে যেমন আশা করেছিলেন ঠিক তেমন পদ্ধতি প্রয়োগ না করার জন্য সতর্কতা প্রকাশ করবে। জাভা (যেমন স্কাফম্যান হিসাবে উল্লিখিত) এর বিপরীতে , যদি কোনও উদ্দেশ্য-সি শ্রেণি একটি আনুষ্ঠানিক প্রোটোকলে থাকা পদ্ধতিগুলি প্রয়োগ করে, তবে তাকে সেই প্রোটোকলের সাথে "মেনে চলতে" বলা হয়, এমনকি যদি এর ইন্টারফেসটি সুস্পষ্টভাবে এটি গ্রহণ না করে।আপনি কোডে প্রোটোকল কনফরমেন্স পরীক্ষা করতে পারেন ( -রকমফরমোটোপ্রোটোকল ব্যবহার করে ):
if ([myObject conformsToProtocol:@protocol(MyProtocol)]) {
...
}
দ্রষ্টব্য: অ্যাপলের ডকুমেন্টেশনে বলা হয়েছে:
"উপরের চিত্রের মতো এই পদ্ধতিটি সম্পূর্ণরূপে শিরোনামের ফাইলগুলিতে আনুষ্ঠানিক ঘোষণার ভিত্তিতে কনফারেন্স নির্ধারণ করে। প্রোটোকলে ঘোষিত পদ্ধতিগুলি বাস্তবে বাস্তবায়িত হয়েছে কিনা তা যাচাই করে না - এটি প্রোগ্রামারের দায়িত্ব" "
অবজেক্টিভ-সি 2.0 হিসাবে (ওএস এক্স 10.5 "চিতাবাঘ" এবং আইওএসে), আনুষ্ঠানিক প্রোটোকলগুলি এখন al চ্ছিক পদ্ধতিগুলি সংজ্ঞায়িত করতে পারে এবং কোনও শ্রেণি যতক্ষণ না সমস্ত প্রয়োজনীয় পদ্ধতি প্রয়োগ করে ততক্ষণ প্রোটোকলের সাথে সম্মতি রাখে। আপনি @required(ডিফল্ট) এবং @optionalকীওয়ার্ডগুলি টগল করতে ব্যবহার করতে পারেন যে পদ্ধতি ঘোষণাগুলি অনুসরণ করে অবশ্যই প্রোটোকলের সাথে খাপ খাইয়ে প্রয়োগ করতে হবে বা প্রয়োগ করা যেতে পারে। (অ্যাপলটির উদ্দেশ্য-সি 2.0 প্রোগ্রামিং ভাষা নির্দেশিকার বিভাগটি দেখুন যা the চ্ছিক প্রোটোকল পদ্ধতিগুলি নিয়ে আলোচনা করে ))
Ptionচ্ছিক প্রোটোকল পদ্ধতিগুলি বিকাশকারীদের, বিশেষত প্রতিনিধি এবং শ্রোতা বাস্তবায়নের জন্য প্রচুর নমনীয়তা উন্মুক্ত করে । মাউস ইনপুট অ্যাডাপ্টার (যা বিরক্তিকর হতে পারে, যেহেতু জাভাও একক-উত্তরাধিকার) এর মতো কিছু বাড়ানোর পরিবর্তে বা প্রচুর অর্থহীন, খালি পদ্ধতিগুলি প্রয়োগ করার পরিবর্তে, আপনি একটি প্রোটোকল গ্রহণ করতে পারেন এবং কেবলমাত্র আপনার পছন্দসই aboutচ্ছিক পদ্ধতি প্রয়োগ করতে পারেন। এই নিদর্শনটির সাথে, কলার পদ্ধতিটি অনুরোধ করার আগে এটি প্রয়োগ করা হয়েছে কিনা তা যাচাই করে নিন ( -sonsposToSelector ব্যবহার করে ):
if ([myObject respondsToSelector:@selector(fillArray:withObject:)]) {
[myObject fillArray:anArray withObject:foo];
...
}
যদি প্রতিবিম্বের ওভারহেড কোনও সমস্যা হয়ে যায় তবে আপনি পুনরায় ব্যবহারের জন্য বুলিয়ান ফলাফলটি সর্বদা ক্যাশে করতে পারেন , তবে অকালকে অপ্টিমাইজ করার তাগিদকে প্রতিহত করতে পারেন। :-)
-conformsToProtocol:শ্রেণি স্পষ্টভাবে প্রোটোকল গ্রহণ করে তবেই হ্যাঁ ফিরিয়ে আনবে। আপনি কি এটি চেষ্টা করেছেন?
-conformsToProtocol:সত্যই কি ক্লাসের (বা পূর্বপুরুষ) আনুষ্ঠানিকভাবে ঘোষণা করতে হবে যে এটি প্রোটোকল গ্রহণ করে। আমি কীভাবে ভুল পেয়েছি তা নিশ্চিত নয়, সংশোধনের জন্য ধন্যবাদ!
তারা প্রায় অভিন্ন। তবে একটি জিনিস যা আমাকে ধরা দিয়েছে, তা হ'ল আপনি যদি স্পষ্টভাবে ঘোষণা না করেন যে কোনও উদ্দেশ্য সি প্রোটোকল এনএসওবজেক্টকেও কার্যকর করে না, সেই প্রোটোকলের উল্লেখগুলি এনএসবজেক্ট যে পদ্ধতিতে ঘোষণা করে (যেভাবেই কোনও সংকলক সতর্কতা ছাড়াই) ঘোষণা করে না to জাভা দিয়ে আপনার একটি ইন্টারফেসের রেফারেন্স থাকতে পারে এবং তারপরেও স্ট্রিং () ইত্যাদি কল করতে পারেন।
যেমন
উদ্দেশ্য গ:
@protocol MyProtocol
// Protocol definition
@end
id <MyProtocol> myProtocol;
[myProtocol retain] // Compiler warning
জাভা:
public interface MyInterface {
// interface definition
}
MyInterface myInterface;
myInterface.toString(); // Works fine.
উদ্দেশ্য সি (স্থির):
@protocol MyProtocol <NSObject>
// Protocol definition
@end
id <MyProtocol> myProtocol;
[myProtocol retain] // No Warning