আমার একটি বেস ক্লাস আছে Base
,। এটি দুটি সাবক্লাস, Sub1
এবং Sub2
। প্রতিটি সাবক্লাসের কিছু অতিরিক্ত পদ্ধতি রয়েছে। উদাহরণস্বরূপ, Sub1
আছে Sandwich makeASandwich(Ingredients... ingredients)
এবং Sub2
আছে boolean contactAliens(Frequency onFrequency)
।
যেহেতু এই পদ্ধতিগুলি বিভিন্ন পরামিতি নেয় এবং সম্পূর্ণ ভিন্ন জিনিস করে, সেগুলি সম্পূর্ণ বেমানান এবং আমি এই সমস্যাটি সমাধান করার জন্য কেবল পলিমারফিজম ব্যবহার করতে পারি না।
Base
বেশিরভাগ কার্যকারিতা সরবরাহ করে এবং আমার কাছে Base
অনেকগুলি অবজেক্টের সংগ্রহ রয়েছে । যাইহোক, সমস্ত Base
বস্তু হয় হয় এক Sub1
বা একটি Sub2
, এবং কখনও কখনও আমার সেগুলি কী তাও জানতে হবে।
নিম্নলিখিতগুলি করা একটি খারাপ ধারণা বলে মনে হচ্ছে:
for (Base base : bases) {
if (base instanceof Sub1) {
((Sub1) base).makeASandwich(getRandomIngredients());
// ... etc.
} else { // must be Sub2
((Sub2) base).contactAliens(getFrequency());
// ... etc.
}
}
সুতরাং আমি কাস্টিং ছাড়াই এড়াতে একটি কৌশল নিয়ে এসেছি। Base
এখন এই পদ্ধতিগুলি রয়েছে:
boolean isSub1();
Sub1 asSub1();
Sub2 asSub2();
এবং অবশ্যই, Sub1
এই পদ্ধতিগুলি প্রয়োগ করে
boolean isSub1() { return true; }
Sub1 asSub1(); { return this; }
Sub2 asSub2(); { throw new IllegalStateException(); }
এবং Sub2
তাদের বিপরীত উপায়ে প্রয়োগ করে।
দুর্ভাগ্যক্রমে, এখন Sub1
এবং Sub2
তাদের নিজস্ব API এ এই পদ্ধতিগুলি রয়েছে। সুতরাং আমি এটি করতে পারি, উদাহরণস্বরূপ, চালু Sub1
।
/** no need to use this if object is known to be Sub1 */
@Deprecated
boolean isSub1() { return true; }
/** no need to use this if object is known to be Sub1 */
@Deprecated
Sub1 asSub1(); { return this; }
/** no need to use this if object is known to be Sub1 */
@Deprecated
Sub2 asSub2(); { throw new IllegalStateException(); }
এইভাবে, যদি অবজেক্টটি কেবলমাত্র একটি হিসাবে পরিচিত হয় Base
, তবে এই পদ্ধতিগুলি অবনমিত হয় না, এবং নিজেকে "কাস্ট" করতে ব্যবহৃত হতে পারে অন্যরকম যাতে আমি এটিতে সাবক্লাসের পদ্ধতিগুলি অনুরোধ করতে পারি। এটি আমার কাছে একরকম মার্জিত বলে মনে হয়, তবে অন্যদিকে, আমি ক্লাস থেকে পদ্ধতিগুলি "মুছে ফেলার" উপায় হিসাবে অবজ্ঞাপূর্ণ টীকাগুলির একধরণের অপব্যবহার করছি।
যেহেতু একটি Sub1
উদাহরণ সত্যই একটি বেস, তাই এটি এনক্যাপসুলেশন না করে উত্তরাধিকার ব্যবহার করার জন্য অর্থবোধ করে। আমি কি ভাল করছি? এই সমস্যা সমাধানের জন্য আরও ভাল উপায় আছে?
instanceof
এমনভাবে যা প্রচুর টাইপিংয়ের প্রয়োজন হয় তা ত্রুটি-প্রবণ এবং আরও সাবক্লাস যুক্ত করা শক্ত করে তোলে।
Sub1
এবং Sub2
বিনিময়যোগ্যভাবে ব্যবহার না করা যায় তবে আপনি কেন তাদের সাথে এমন ব্যবহার করেন? আপনার 'স্যান্ডউইচ-নির্মাতারা' এবং 'এলিয়েন-কন্টাক্টেটর' আলাদাভাবে রাখবেন না কেন?