ইন্টারফেস কে প্রসারিত করে? এবং কেন?


20

আফাইক, আমার ক্লাস extendsপ্যারেন্ট ক্লাস এবং implementsইন্টারফেস। তবে আমি এমন একটি পরিস্থিতি ছড়িয়েছি, যেখানে আমি ব্যবহার করতে পারি না implements SomeInterface। এটি জেনেরিক প্রকারের ঘোষণা। উদাহরণ স্বরূপ:

public interface CallsForGrow {...}

public class GrowingArrayList <T implements CallsForGrow>  // BAD, won't work!
                              extends ArrayList<T> 

এখানে implementsসিনথেটিকভাবে ব্যবহার নিষিদ্ধ। আমি প্রথমে ভেবেছিলাম, <> ভিতরে ইন্টারফেস ব্যবহার করা মোটেও নিষিদ্ধ, তবে না। এটা সম্ভব, আমি কেবল extendsপরিবর্তে ব্যবহার করতে হবে implements। ফলস্বরূপ, আমি একটি ইন্টারফেস "প্রসারিত" করছি। এটি অন্য একটি উদাহরণ কাজ করে:

public interface CallsForGrow {...}

public class GrowingArrayList <T extends CallsForGrow>  // this works!
                              extends ArrayList<T> 

আমার কাছে এটিকে সিন্ট্যাক্টিকাল অসঙ্গতি বলে মনে হচ্ছে। তবে আমি জাভা 6 এর কিছু জরিমানা বুঝতে পারি না? আমার অন্যান্য ইন্টারফেসগুলি বাড়ানো উচিত এমন অন্য কোনও জায়গা আছে? ইন্টারফেসের, যেটি আমি প্রসারিত করতে চাইছি, এর কিছু বিশেষ বৈশিষ্ট্য থাকা উচিত?

উত্তর:


25

জেনেরিক টাইপের ভেরিয়েবলের ক্ষেত্রে সংকলক আসলে Tক্লাস, ইন্টারফেস, এনম বা এনোটেশন হিসাবে যত্নশীল হয় না । এটির জন্য কেবল যত্নশীল হ'ল এটি একটি প্রকার যা উপ-এবং সুপার-প্রকারের দেওয়া সেট সহ।

এবং বাক্য গঠন জটিল করার কোনও কারণ নেই কারণ কেবলমাত্র অন্য এক জায়গায় (যেখানে আপনি আসলে একটি ইন্টারফেস প্রয়োগ করেন) শ্রেণি এবং ইন্টারফেসের মধ্যে পার্থক্য প্রাসঙ্গিক (উদাহরণস্বরূপ যদি আপনি implementএকটি ইন্টারফেস হন, আপনাকে এটি নির্ধারণ করা সমস্ত পদ্ধতি প্রয়োগ করতে হবে, তবে আপনি আপনার যদি extend(অ-বিমূর্ত) বর্গ থাকে তবে দরকার নেই।

এক মুহূর্তের জন্য ধরে নেওয়া যাক আপনি লিখতে চাই যে implementsএখানে, তারপর আপনি জন্য পৃথক সিনট্যাক্স প্রয়োজন চাই enumমান (পরিবর্তে কেবল লেখার <E extends Enum<E>>) এবং টীকা (আপনি সহজেই ব্যবহার ডিক্লেয়ার করতে পারে <A extends Annotation>)।

আপনি যেখানে লিখতে হবে কেবলমাত্র সেই জায়গাটি যেখানে implementsআপনি আসলে ইন্টারফেসটি প্রয়োগ করেন implement এ যে বিন্দু (এবং যে বিন্দু শুধুমাত্র) পার্থক্য গুরুত্বপূর্ণ, কারণ আপনার পদ্ধতি ইন্টারফেস সংজ্ঞায়িত বাস্তবায়ন করতে হবে। অন্য সবার জন্য, প্রদত্ত Aযে কোনও বেস ক্লাস বা এটি একটি বাস্তবায়িত ইন্টারফেস কিনা তা বিবেচনাধীন নয় B: এটি একটি সুপার টাইপ এবং এগুলিই এটি গুরুত্বপূর্ণ।

এছাড়াও লক্ষ করুন যে অন্য একটি জায়গা যেখানে আপনি extendsইন্টারফেসের সাথে ব্যবহার করেন:

interface A {
}

interface B extends A {
}

এই মুহূর্তে implementsভুল হতে হবে, কারণ B বাস্তবায়ন করে না A


যদি আমরা আপনার লজিকগুলি ব্যবহার করি তবে আমাদের কেবল জেনারিকগুলিতেই নয়, সর্বদা 'সামার ইনট্রাফেস প্রসারিত' ব্যবহার করা উচিত ।
গাংনাস

2
@ গাংনাস: না, কারণ বাস্তবায়নকারীদের মধ্যে একটি পার্থক্য রয়েছে extendsএবং implementsএটি খাঁটি টাইপ-সিস্টেমের দৃষ্টিকোণ থেকে ইস্যুটির দিকে কোনও পার্থক্য নেই।
জোচিম সউর

1
দুঃখিত, আমি আপনার চিন্তা বুঝতে পারি না। --1। কেন আমাদের "খাঁটি টাইপ-সিস্টেমের দৃষ্টিভঙ্গি" ব্যবহার করা উচিত অন্য ক্ষেত্রে নয়? --2। কেন সিনট্যাকটিক চাহিদা এই বিভিন্ন জায়গায় পরিবর্তন? আপনি এটি ব্যাখ্যা করতে পারেন, দয়া করে। উত্তরে, সম্ভব হলে।
গাংনাস

1
@ গাংনাস: কে বলে যে Tএটি একটি শ্রেণি? Tএকটি ইন্টারফেস টাইপ বা একটি enumটাইপ উল্লেখ করতে পারে ।
জোছিম সউর

1
সি # থেকে আসা, এই পুরো আলোচনা হাস্যকর। আমরা এর সাথে কোনও ধরণের সুপারটাইপগুলি বোঝাই :। এবং কভারগুলির অধীনে, একটি ইন্টারফেস হ'ল এবং সর্বদা একটি বিমূর্ত শ্রেণি ছিল কেবলমাত্র অবিহিত ভার্চুয়াল ( abstract) সদস্য ধারণের সীমাবদ্ধতার সাথে , যাতে একাধিক উত্তরাধিকারের অনুমতি দেয়। আক্ষরিক implementsএবং এর মধ্যে কোন পার্থক্য নেই extends। এগুলি উভয়ই একই শব্দের সাথে প্রতিস্থাপন করা যেতে পারে ( extends) বা কোনও স্বেচ্ছাচারী প্রতীক ( :) দিয়ে এবং কিছুই হারাতে পারে না।
সারা

5

যখন জাভা 5, এবং বিশেষ জেনেরিকসে প্রাথমিকভাবে এমন বিকাশকারীদের জন্য উপলব্ধ করা হয়েছিল যারা আগ্রহী নিবন্ধটি তৈরি করেছিলেন সিনট্যাক্সটি একেবারেই আলাদা ছিল। পরিবর্তেSet<? extends Foo> এবং Set<? super Bar>এটি ছিল Set<+Foo>এবং Set<-Foo>। তবে, প্রতিক্রিয়াটি ছিল যে এটি নির্দিষ্ট বা বৃহত্তর (আরও ক্লাস)+ বোঝানো হচ্ছে কিনা তা পরিষ্কার নয় । সূর্যের বাক্যটি সিনট্যাক্স পরিবর্তন করে সাড়া দিয়েছিল, তবে নতুন কীওয়ার্ড না আনার সীমাবদ্ধতার মধ্যে, যা পিছনের সামঞ্জস্যের জন্য সমস্যা হয়ে দাঁড়াবে।

ফলাফলটিও একেবারেই স্বাভাবিক নয়। যেমন আপনি পর্যবেক্ষণ করেছেন, extendsক্লাসগুলির "প্রসারিত" ইন্টারফেসগুলির কথা বলার জন্য অত্যধিক বোঝা রয়েছে, যা অন্যান্য প্রসঙ্গে ব্যবহৃত ভাষা নয়; এবং superবোঝাতে "হয় একটি সুপারক্লাস" ওভারলোড করা হয়, যা সম্পর্কের বিপরীত দিক পূর্বে কীওয়ার্ডটি অর্থাত একটি সুপারক্লাস উল্লেখ দ্বারা প্রকাশ করা হয়।

যাইহোক, কোনও ইন্টারফেস কীসের মূলসূত্রগুলি এই পরিবর্তন দ্বারা প্রভাবিত হয় না এবং এটি বিশেষ ইন্টারফেসগুলি প্রবর্তন করে না যা একটি নতুন উপায়ে প্রসারিত।


+1 টি। আমি দেখি এবং সম্মত হই তবে জোছিম সৌর আমার ভুল ধারণাটি খুঁজে পেয়েছে যে টি অগত্যা একটি বর্গ। সুতরাং, উত্তরটি তার। আপনার বোঝাপড়াটি এক (বা 2) তলা উচ্চতর :-)। আমার সমস্যা আরও আদিম ছিল। আমার উন্নয়নের জন্য যাইহোক আপনাকে ধন্যবাদ।
গাংনাস

2

এই জাতীয় সিনট্যাক্সকে অনুমতি দেওয়া এবং নিষেধ করা এবং এর মধ্যে উভয়ই অসুবিধা রয়েছে দেওয়াগুলি এর চেয়েও বড়।

একটু ভেবে দেখুন।

ইন্টারফেস পৃথককরণ এবং বাস্তবায়ন মৌলিক প্রোগ্রামিং আইডিয়ামগুলির মধ্যে একটি। যে কারণে, সিনট্যাক্স বানান করতে সক্ষম হবেন "ইন্টারফেস কার্যকরী কিছু" হিসাবে খারাপ হিসাবে ব্যবহার প্লাস বোঝাতে চিহ্ন সম্পর্কে হবে গুণ operands করুন।


ঠিক আছে. সুতরাং, আমি সত্যিই কিছু বুঝতে পারি না। আমি এটিকে খুব সম্ভাব্য বলে বিবেচনা করেছি। তবে আপনি সমস্যাটি মোটেও ব্যাখ্যা করেছেন, দুঃখিত। টি একটি শ্রেণীর উপস্থাপনা। কেন আমি এক জায়গায় টি এক্স প্রসারণ এবং অন্য টি প্রয়োগে ব্যবহার করি?
গাংনাস

@ গ্যাঙ্গনাস আপনি যে উদাহরণ সরবরাহ করেছেন তাতে প্যারামিটার টাইপ করে যা প্রয়োজনীয়ভাবে কোনও শ্রেণি হয় না - জোছিম আপনাকে ইতিমধ্যে কী বলেছিল তা দেখুন । অনুমতি কার্যকরী এটা জন্য একই জগাখিচুড়ি আমি উল্লেখ হতে হবে
মশা

হ্যাঁ, আমি ইতিমধ্যে তাঁর মন্তব্য দেখেছি। উত্তরে রাখলে উত্তর হিসাবে চিহ্নিত করা হবে। যতক্ষণ না আপনারা উভয়েরই আমার ধন্যবাদ এবং +1 থাকুন।
গাংনাস

-1

এক চাহিদা বুঝতে ইন্টারফেস চালিত প্রোগ্রামিং পরবর্তী ধাপে হিসাবে একটি ইন্টারফেস বুঝতে হয়। এটি ইন্টারফেসের আসল ব্যবহার কি তা জানায়। এটি জাভা (বা অন্য কোনও ভাষা) প্রোগ্রামে কী ভূমিকা পালন করে।


2
আপনার উত্তরটি কীভাবে ওপি'র উদ্বেগকে মোকাবেলা করবে? আরও উত্তর পরিষ্কার করার জন্য দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.