জাভা ইন্টারফেস এবং উদ্দেশ্য-সি প্রোটোকলের মধ্যে পার্থক্য?


93

আমি জাভা জানি, এবং এখন আমি অবজেক্টিভ-সি শিখছি। জাভা ইন্টারফেস এবং অবজেক্টিভ-সি প্রোটোকলের মধ্যে ঠিক কী পার্থক্য রয়েছে?

উত্তর:


82

প্রথমে, জাভাটির অন্যতম নির্মাতাদের থেকে এই বিষয়ে সামান্য 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];
    ...
}

যদি প্রতিবিম্বের ওভারহেড কোনও সমস্যা হয়ে যায় তবে আপনি পুনরায় ব্যবহারের জন্য বুলিয়ান ফলাফলটি সর্বদা ক্যাশে করতে পারেন , তবে অকালকে অপ্টিমাইজ করার তাগিদকে প্রতিহত করতে পারেন। :-)


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

4
"যদি কোনও অবজেক্টিভ-সি শ্রেণি একটি আনুষ্ঠানিক প্রোটোকলে থাকা পদ্ধতিগুলি প্রয়োগ করে তবে তার প্রোটোকলের সাথে এটি" মেনে চলতে "বলা হয়, এমনকি যদি এর ইন্টারফেসটি সুস্পষ্টভাবে এটি গ্রহণ না করে তবে আপনি কোডে প্রোটোকল কনফর্মেন্স পরীক্ষা করতে পারেন (-রকমফর্মটোপ্রোটোকল ব্যবহার করে: ) এর মত "এটি মিথ্যা। -conformsToProtocol:শ্রেণি স্পষ্টভাবে প্রোটোকল গ্রহণ করে তবেই হ্যাঁ ফিরিয়ে আনবে। আপনি কি এটি চেষ্টা করেছেন?
ব্যবহারকারী 102008

4
আপনি সঠিক, -conformsToProtocol:সত্যই কি ক্লাসের (বা পূর্বপুরুষ) আনুষ্ঠানিকভাবে ঘোষণা করতে হবে যে এটি প্রোটোকল গ্রহণ করে। আমি কীভাবে ভুল পেয়েছি তা নিশ্চিত নয়, সংশোধনের জন্য ধন্যবাদ!
কুইন টেলর

18

তারা প্রায় অভিন্ন। তবে একটি জিনিস যা আমাকে ধরা দিয়েছে, তা হ'ল আপনি যদি স্পষ্টভাবে ঘোষণা না করেন যে কোনও উদ্দেশ্য সি প্রোটোকল এনএসওবজেক্টকেও কার্যকর করে না, সেই প্রোটোকলের উল্লেখগুলি এনএসবজেক্ট যে পদ্ধতিতে ঘোষণা করে (যেভাবেই কোনও সংকলক সতর্কতা ছাড়াই) ঘোষণা করে না 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

25
এটি কারণ আইডি এবং এনএসবজেক্ট এক নয় । জাভাতে মূল অবজেক্টটি অবজেক্ট। উদ্দেশ্য সি ইন, NSObject একটি রুট বস্তু, কিন্তু নয় রুট অবজেক্ট। আপনি যদি সমস্ত এনএসবজেক্ট পদ্ধতিতে (শ্রেণি পদ্ধতি পাশাপাশি প্রোটোকল) অ্যাক্সেস করতে চান তবে এটিকে স্পষ্টভাবে লিখুন: এনএসবজেক্ট <মাইপ্রোটোকল> মাইপ্রোটোকল; পরিবর্তে: আইডি <মাইপ্রোটোকল> ... আপনি যখন আইডি ব্যবহার করেন আপনি বলছেন: আমি কেবলমাত্র প্রোটোকলটির জন্য বিষয়টির যত্ন নিই না , যা আপনার ক্ষেত্রে সত্য নয়।
জেসন কোকো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.