ধরুন আপনার দুটি ইন্টারফেস রয়েছে:
interface Readable {
public void read();
}
interface Writable {
public void write();
}
কিছু ক্ষেত্রে বাস্তবায়নকারী অবজেক্টগুলি কেবল এর মধ্যে একটিকে সমর্থন করতে পারে তবে অনেক ক্ষেত্রে বাস্তবায়ন উভয় ইন্টারফেসকে সমর্থন করবে। ইন্টারফেস ব্যবহার করে এমন লোকদের এমন কিছু করতে হবে:
// can't write to it without explicit casting
Readable myObject = new MyObject();
// can't read from it without explicit casting
Writable myObject = new MyObject();
// tight coupling to actual implementation
MyObject myObject = new MyObject();
এই বিকল্পগুলির কোনওটিই মারাত্মকভাবে সুবিধাজনক নয়, এমনকি এটি বিবেচনা করার সময় আপনি কোনও পদ্ধতি পরামিতি হিসাবে এটি চান।
একটি সমাধান হ'ল একটি মোড়ানো ইন্টারফেস ঘোষণা করা:
interface TheWholeShabam extends Readable, Writable {}
সব বাস্তবায়নের সমর্থন উভয় রিডেবল এবং সম্পাদনা করার যোগ্য: কিন্তু এই এক নির্দিষ্ট সমস্যা আছে আছে TheWholeShabam বাস্তবায়ন যদি তারা ইন্টারফেস ব্যবহার করে মানুষের সাথে সামঞ্জস্যপূর্ণ হতে চাই। যদিও এটি উভয় ইন্টারফেসের গ্যারান্টিযুক্ত উপস্থিতি ব্যতীত অন্য কিছু সরবরাহ করে না।
এই সমস্যার কোনও পরিষ্কার সমাধান আছে নাকি আমার মোড়কের ইন্টারফেসের জন্য যাওয়া উচিত?
হালনাগাদ
আসলে প্রায়শই এমন কোনও বিষয় থাকা প্রয়োজন যা পাঠযোগ্য এবং লিখিত উভয়ই তাই সহজেই যুক্তিগুলির মধ্যে উদ্বেগগুলি পৃথক করে রাখা সবসময় একটি পরিষ্কার সমাধান নয়।
UPDATE2
(উত্তর হিসাবে উত্তোলন করা হয়েছে যাতে এটিতে মন্তব্য করা সহজ)
UPDATE3
দয়া করে সাবধান হন যে এর জন্য প্রাথমিক ইউসকেস স্ট্রিম নয় (যদিও এগুলিও সমর্থিত হতে হবে)। স্ট্রিমগুলি ইনপুট এবং আউটপুটটির মধ্যে খুব নির্দিষ্ট পার্থক্য তৈরি করে এবং সেখানে দায়িত্বগুলির একটি স্পষ্ট বিচ্ছেদ রয়েছে। বরং, বাইটবফারের মতো এমন কিছু চিন্তা করুন যেখানে আপনাকে এমন একটি অবজেক্টের দরকার হয় যেখানে আপনি লিখতে এবং পড়তে পারেন, এমন একটি বস্তু যা এর সাথে খুব নির্দিষ্ট রাষ্ট্রের সাথে সংযুক্ত থাকে। এই বস্তুগুলি বিদ্যমান কারণ এগুলি অ্যাসিক্রোনাস আই / ও, এনকোডিংগুলি, ...
UPDATE4
আমি প্রথমে যা চেষ্টা করেছি তার মধ্যে একটি নীচে প্রদত্ত পরামর্শের মতোই ছিল (স্বীকৃত উত্তরটি পরীক্ষা করুন) তবে এটি খুব ভঙ্গুর বলে প্রমাণিত হয়েছিল।
ধরুন আপনার কাছে এমন কোনও ক্লাস রয়েছে যা টাইপটি ফেরত দিতে হবে:
public <RW extends Readable & Writable> RW getItAll();
আপনি যদি এই পদ্ধতিটি কল করেন তবে জেনেরিক আরডাব্লুটি ভেরিয়েবলটি প্রাপ্ত হওয়ার মাধ্যমে নির্ধারিত হয়, সুতরাং আপনার এই বর্ণটি বর্ণনা করার একটি উপায় প্রয়োজন।
MyObject myObject = someInstance.getItAll();
এটি কাজ করবে কিন্তু আবার এটি বাস্তবায়নের সাথে যুক্ত করে এবং আসলে রানটাইমে ক্লাসকস্টেক্সেপশন ফেলে দিতে পারে (কী ফিরে আসে তার উপর নির্ভর করে)।
অতিরিক্তভাবে আপনি যদি আরডাব্লু প্রকারের শ্রেণির পরিবর্তনশীল চান তবে আপনার শ্রেণি স্তরে জেনেরিকটি সংজ্ঞায়িত করতে হবে।